Я построил изображение для запуска Apache с mod_php, для разработки расширений Magento. Magento необходимо выполнить запись в webroot: он хранит файлы в /srv/magento/var/
для кэша, отчетов об ошибках и некоторых других функций. Webroot на этом изображении является томом docker, а Apache не запускается от имени root, поэтому он не может выполнять запись в файловую систему, поэтому Magento завершается сбоем.
На самом деле я не могу надежно chown или chmod каталог внутри контейнера. Я не хочу использовать контейнер тома Docker, потому что разработчики должны иметь прямой доступ к файлам в Magento webroot. Я бы не особенно возражал против запуска Apache от имени root в контейнере, но apachectl
похоже, он действительно возражает.
Каков подходящий способ предоставить пользователю Apache в контейнере Docker доступ на запись к тому?
Рассмотрим этот примерный случай:
$ 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