![Docker 上的 Apache 无法写入卷文件系统](https://linux22.com/image/648012/Docker%20%E4%B8%8A%E7%9A%84%20Apache%20%E6%97%A0%E6%B3%95%E5%86%99%E5%85%A5%E5%8D%B7%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F.png)
我建造了一个图像用于运行带有 mod_php 的 Apache,用于 Magento 扩展开发。Magento 需要写入 webroot:它将文件保存在/srv/magento/var/
缓存、错误报告和其他一些功能中。此映像上的 webroot 是 docker 卷,Apache 不以 root 身份运行,因此它无法写入文件系统,因此 Magento 失败。
我实际上无法可靠地更改或修改容器内的目录。我不想使用 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
答案1
至少在 VirtualBox 上看起来你不能改变股份的所有权。由于 boot2docker 为我尝试支持的大多数开发人员使用 VirtualBox,因此我无法指望用 解决我的问题chown
。如果我可以使用,我的问题就不会那么困难Docker 卷容器但这妨碍了开发人员的使用。所以我想出了另一个解决方案:我写了一个脚本,以拥有 webroot 的任何用户身份运行 Apache。
其要点如下:
#!/bin/bash
...
adduser --system --uid=$(stat -c %u .) "$owner"
echo "APACHE_RUN_USER=$owner" >> /etc/apache2/envvars
如果你不能打败他们,就加入他们。