Docker上的Apache无法写入卷文件系统

我用mod_php构build了一个运行Apache 的图像 ,用于Magento扩展开发。 Magento需要写入webroot:它将文件保存在/srv/magento/var/用于caching,错误报告和其他一些function。 这个图片上的webroot是一个docker卷,Apache不能以root身份运行,所以它不能写入文件系统,所以Magento失败了。

我不能实际chown或chmod在容器内的目录可靠。 我不想使用Docker Volume Container,因为开发者应该可以直接访问Magento webroot中的文件。 我不会特别介意在容器中以root身份运行Apache,但apachectl确实似乎介意。

给Docker容器中的Apache用户写入对卷的访问权的合适方式是什么?

考虑这个例子:

 $ 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.php Connecting 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 exist index.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 

在VirtualBox上,至less,似乎你不能改变共享的所有权 。 由于boot2docker对大多数我试图支持的开发人员使用VirtualBox,所以我不能指望用chown解决我的问题。 如果我可以使用Docker Volume Containers ,那么我的问题并不困难,但是阻碍了开发人员的使用。 所以我想出了另一个解决scheme:我写了一个脚本来运行Apache,无论用户拥有哪个webroot 。

它的肉是:

 #!/bin/bash ... adduser --system --uid=$(stat -c %u .) "$owner" echo "APACHE_RUN_USER=$owner" >> /etc/apache2/envvars 

如果你不能打败他们,join他们。