Yo construí imagen para ejecutar Apache con mod_php, para el desarrollo de extensiones de Magento. Magento necesita escribir en la raíz web: mantiene los archivos en /srv/magento/var/
para caché, informes de errores y algunas otras funciones. La raíz web de esta imagen es un volumen de docker, y Apache no se ejecuta como root, por lo que no puede escribir en el sistema de archivos, por lo que Magento falla.
En realidad, no puedo chown o chmod el directorio dentro del contenedor de manera confiable. No quiero usar un Contenedor de Volumen Docker porque los desarrolladores deberían tener acceso directo a los archivos en la raíz web de Magento. No me importaría particularmente ejecutar Apache como root en el contenedor, pero apachectl
seguro que parece importarle.
¿Cuál es la forma adecuada de dar al usuario de Apache en un contenedor Docker acceso de escritura a un volumen?
Considere este caso de ejemplo:
$ cd $(mktemp -dt$(date +%s))$ docker run -d -p 80:80 -v "$PWD:/srv/magento" kojiromike/magento_apache$ cat > index.php <<PHP<?php file_put_contents('foo', 'bar');PHP$ wget -SO/dev/null http://$(boot2docker ip 2>/dev/null)/index.php--2014-12-15 13:33:59-- http://192.168.59.103/index.phpConnecting to 192.168.59.103:80... connected.HTTP request sent, awaiting response... HTTP/1.1 200 OK Date: Mon, 15 Dec 2014 17:18:49 GMT Server: Apache/2.2.22 (Debian) X-Powered-By: PHP/5.4.35-0+deb7u2 Vary: Accept-Encoding Content-Length: 0 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html The file is already fully retrieved; nothing to do.$ ls # Expecting 'foo' to existindex.php$ docker exec -ti $(docker ps -lq) tail -n 4 /var/log/apache2/error.log[Mon Dec 15 17:18:49 2014] [error] [client 192.168.59.3] PHP Warning: file_put_contents(foo): failed to open stream: Permission denied in /srv/magento/index.php on line 1[Mon Dec 15 17:18:49 2014] [error] [client 192.168.59.3] PHP Stack trace:[Mon Dec 15 17:18:49 2014] [error] [client 192.168.59.3] PHP 1. {main}() /srv/magento/index.php:0[Mon Dec 15 17:18:49 2014] [error] [client 192.168.59.3] PHP 2. file_put_contents() /srv/magento/index.php:1