web-dev-qa-db-ja.com

Docker上のApacheはボリュームファイルシステムに書き込めません

Magento拡張機能の開発用に、mod_phpを使用してApacheを実行するために イメージ を作成しました。 Magentoはウェブルートに書き込む必要があります:ファイルを/srv/magento/var/キャッシュ、エラーレポート、およびその他の機能用。このイメージのwebrootはDockerボリュームであり、Apacheはrootとして実行されないため、ファイルシステムに書き込むことができないため、Magentoは失敗します。

コンテナ内のディレクトリを実際にchownまたはchmodすることはできません。開発者はMagentoWebroot内のファイルに直接アクセスできる必要があるため、Dockerボリュームコンテナを使用したくありません。コンテナ内の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
2
kojiro

VirtualBoxでは、少なくとも 共有の所有権を変更することはできません のようです。 boot2dockerは、サポートしようとしているほとんどの開発者にVirtualBoxを使用しているため、chownで問題を解決することは期待できません。 Docker Volume Containers を使用できれば、私の問題は難しくありませんが、それは開発者の使用を妨げます。そこで、別の解決策を考え出しました。 webrootを所有しているユーザーとしてApacheを実行する というスクリプトを作成しました。

その肉は:

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

あなたがそれらを倒すことができない場合は、それらに参加してください。

3
kojiro