permissão de volume do docker negada para o apache em execução no docker enquanto o apache cria arquivos no docroot

1

Eu criei uma imagem do docker com o apache nela. Ao executar essa imagem no contêiner, o processo raiz do apache está sendo executado como root e os processos filhos estão sendo executados como www-data . Um volume docker (VOLUME definido no Dockerfile) é criado como /app/cache/example , que é configurado como docroot no apache.

O Apache sendo executado no contêiner realmente renderizando dados de um ponto de extremidade http de back-end e armazenando ativos estáticos em cache no apache docroot.

Mas o problema é que o apache não pode gravar ativos estáticos no volume do docker. A permissão negada está chegando nos logs e, portanto, todas as solicitações estão indo para o endpoint HTTP de backend.

Para resolver este problema, segui as abordagens abaixo, mas infelizmente não tenho sorte até agora:

  1. alterou a propriedade do volume no host e no contêiner de ambos os lados com www-data . Ambos, host e container, tendo este usuário www-data com as mesmas informações como username, uid, shell, etc.

  2. chmod to 777 no lado do host e do contêiner.

  3. Mesmo seguido o abaixo no Dockerfile:

    RUN useradd foo
    RUN mkdir /data && touch /data/x
    RUN chown -R foo:foo /data
    VOLUME /data
    

Precisa de ajuda de especialistas para resolver esse problema.

    
por Sandeep Sharma 11.03.2017 / 15:58

2 respostas

0

Você pode ter mais sorte montando o volume em um diretório na máquina host (como na montagem fora das montagens / var / lib / docker). O conveniente de fazer isso é que você pode usar setfacl para definir recursivamente as permissões padrão no diretório para serem rw por www-data, apenas defina explicitamente o uid ao criar o container para o usuário www-data e usá-lo para o defina as permissões do host, pois o usuário nomeado provavelmente não existirá no host.

Uma coisa adicional que você pode querer investigar é não executar nada em seu contêiner como root. Mesmo que a sua instância do Apache esteja vinculada a uma porta, o < 1024 pode usar algo como o seguinte para permitir uma baixa ligação de portas sem nenhuma permissão de root:

setcap cap_net_bind_service=+ep <your Apache binary>

Embora, a porta à qual você está ligando não deva importar de dentro do contêiner porque você poderia, por exemplo, mapear a porta 8080 para uma porta host diferente em tempo de execução.

Se você adicionar uma diretiva USER ao final do seu arquivo docker, não deverá haver nenhuma instância de permissões mistas.

    
por 13.03.2017 / 15:00
0

Tente executar

chcon -R -t httpd_sys_rw_content_t /path/to/your/site

ou use o diretório de referência:

chcon -R --reference=/var/www/html /www/sites

Mais informações:

Link para referência

    
por 13.03.2017 / 20:10

Tags