Estou criando uma imagem do Docker para o meu Symfony
aplicativo e preciso dar permissão ao servidor apache para gravar em cache e pastas de log
#Dockerfile
FROM php:7-apache
RUN apt-get update \
&& apt-get install -y libicu-dev freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite
COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html
RUN find /var/www/html/ -type d -exec chmod 755 {} \;
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs
Quando crio esta imagem docker build -t myname/symfony_apps:latest .
e executo o contêiner com docker run -p 8080:80 myname/symfony_apps:latest
. O log do Apache é inundado por erros de permissão negada, a coisa estranha que eu verifiquei ls -a
e as permissões estão bem. e quando executo o chmod a partir do bash do contêiner, os problemas de permissão do apache desaparecem e o aplicativo funciona bem
A situação
Executando comandos chmod a partir do dockerfile: as permissões são alteradas, mas o apache ainda reclama da permissão negada. Executando os mesmos comandos chmod com bash dentro do contêiner: as permissões são alteradas e meu aplicativo está sendo executado
Alguma idéia, estou faltando alguma coisa, talvez eu deva adicionar usuário root em algum lugar do Dockerfile?
fonte
apache2.conf
) não está causando problemas? Os erros desaparecem se você não instalarapache2.conf
?Respostas:
Eu tive o mesmo problema e parece que há algum bug no docker ou overlay2 se o conteúdo do diretório for criado em uma camada e suas permissões forem alteradas em outra.
Como solução alternativa, você pode copiar fontes para o diretório temporário:
E então mova-o para
/var/www/html
e configure as permissões (em umRUN
comando):Também criei um problema no GitHub .
fonte
O shell padrão do RUN no Docker é / bin / sh e é aí que as permissões que não estão sendo definidas corretamente têm um problema.
Mas você pode mudar para usar / bin / bash para corrigir facilmente, observe antes e depois da listagem de diretórios
fonte
/bin/bash -c 'chmod +x file'
funcionando e não/bin/sh -c 'chmod +x file'
?Tente adicionar:
Funcionou para mim.
fonte
Esse problema provavelmente é o resultado de uma
VOLUME
definição no Dockerfile upstream. Quando um volume é definido no Dockerfile, você pode adicionar arquivos com um comandoCOPY
ouADD
diretamente na imagem. No entanto, umaRUN
linha irá:RUN
comando, verá suas alterações aplicadas, mas essas alterações foram aplicadas ao volumedocker diff
se você não excluir os contêineres temporários (você pode executar uma compilação--rm=false
para que eles permaneçam)Devido a esse comportamento, você tem as opções para:
Observe que, dentro das imagens php atuais, parece que o volume foi removido, o que significa que temos efetivamente a opção 3.
fonte
Acabei de fazer um experimento com o seguinte:
E isso funciona muito bem.
Contudo
Quando substituo esse arquivo executável por volumes de composição de janela de encaixe, a
execute
permissão é simplesmente como retrocedida - substitui tecnicamente a permissão de arquivo original.A correção para o modo dev é simplesmente
chmod a+x yourfile
do host, que será herdado na composição do volume de montagem.fonte
docker run
comando e sem montagens de volume externas.