O Apache no Docker não pode gravar no sistema de arquivos de volume

2

Eu criei uma imagem para rodar o Apache com o mod_php, para o desenvolvimento da extensão do Magento. O Magento precisa gravar na webroot: Ele mantém os arquivos em /srv/magento/var/ para cache, relatório de erros e alguns outros recursos. O webroot nesta imagem é um volume docker, e o Apache não roda como root, então ele não pode gravar no sistema de arquivos, então o Magento falha.

Eu não posso realmente chown ou chmod o diretório dentro do contêiner de forma confiável. Eu não quero usar um Contêiner de Volume do Docker porque os devs devem ter acesso direto aos arquivos no webroot do Magento. Eu particularmente não me importaria em rodar o Apache como root no container, mas apachectl certamente parece se importar.

Qual é a maneira apropriada de fornecer ao usuário do Apache em um contêiner do Docker acesso de gravação a um volume?

Considere este exemplo:

$ 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
    
por kojiro 15.12.2014 / 19:27

1 resposta

3

No VirtualBox, pelo menos, parece que você não pode mudar a propriedade de uma ação . Como o boot2docker usa o VirtualBox para a maioria dos desenvolvedores que estou tentando suportar, não posso esperar resolver meu problema com chown . Meu problema não seria difícil se eu pudesse usar Contêineres de Volume do Docker , mas isso dificultaria o uso do desenvolvedor. Então eu criei outra solução: eu escrevi um script que executa o Apache como qualquer usuário que possua o webroot .

A carne dela é:

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

Se você não pode vencê-los, junte-se a eles.

    
por 16.12.2014 / 03:08