chmod não está funcionando corretamente no Docker

Estou construindo uma imagem Docker para o meu Symfony app e eu preciso dar permissão ao servidor apache para gravar em cache e pastas de log

#DockerfileFROM php:7-apacheRUN apt-get update \&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \&& docker-php-ext-install intl mbstring \&& a2enmod rewriteCOPY app/php.ini /usr/local/etc/php/COPY app/apache2.conf /etc/apache2/apache2.confCOPY ./ /var/www/htmlRUN 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 eu construo esta imagem com docker build -t myname/symfony_apps:latest . e execute 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 com a qual verifiquei ls -a e as permissões estão bem. e quando executo o chmod do bash do contêiner , os problemas de permissão do apache desapareceram e o aplicativo funciona bem

Situacao

Executando comandos chmod 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á em execução

Alguma ideia, estou perdendo alguma coisa, talvez devesse Adicionar usuário root em algum lugar do Dockerfile ?

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:

COPY . /src

E então mova-o para /var/www/html e permissões de configuração (em um RUN comando):

RUN rm -rf /var/www/html && mv /src /var/www/html &&\    find /var/www/html/ -type d -exec chmod 755 {} \; &&\    find /var/www/html/ -type f -exec chmod 644 {} \; &&\    chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Também criei Problema do GitHub.

Tente adicionar :

USER root

Funcionou para mim.

O shell padrão de execução no Docker é /bin/sh E é aqui que as permissões que não estão sendo definidas corretamente realmente têm um problema.

Mas você pode mudar para apenas usar / bin / bash em vez de corrigir facilmente, observe antes e depois da listagem do diretório

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'---> Running in dc57ae77aa67drwxr-xr-x. 3 root root      103 Mar  8 17:56 .drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..drwxr-xr-x. 2 root root        6 Mar  7 20:47 config-rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jardrwxr-xr-x. 1 root root       42 Mar  8 17:56 .drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..drwxr-xr-x. 2 root root        6 Mar  7 20:47 config-rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar---> 8b5de6e348d3

Este problema é provavelmente o resultado de um VOLUME definição dentro do Dockerfile upstream. Quando um volume é definido no Dockerfile, você pode adicionar arquivos com um COPY ou ADD comando diretamente na imagem. No entanto, a RUN linha vai:

  • Crie um contêiner temporário usando a definição de imagem a partir do ponto atual do dockerfile
    • Esse contêiner temporário terá um volume anônimo montado como você ou uma imagem pai especificada dentro do Dockerfile
    • O volume anônimo será inicializado a partir do conteúdo da imagem
  • Seu comando será executado dentro do contêiner
    • Se você listar o diretório durante este RUN comando, você verá suas alterações aplicadas, mas essas alterações foram aplicadas ao volume
  • Quando o comando Executar for concluído, o docker capturará as alterações no contêiner
    • Essas mudanças podem ser vistas com um docker diff se você não excluir os contêineres Temporários (Você pode executar uma compilação com --rm=false para tê-los permanecer)
    • Essas alterações não incluirão o conteúdo de volume anônimo porque não existem dentro do sistema de arquivos de contêiner temporário, os volumes são separados

Por causa desse comportamento, você tem as opções para:

  1. você pode copiar seus arquivos para um diretório diferente e alterar as permissões lá
  2. você pode corrigir as permissões em seu host para que elas sejam copiadas diretamente com essas permissões
  3. você pode remover o volume de sua imagem, Obter a imagem upstream para remover sua definição de volume ou reconstruir sua própria cópia da imagem upstream sem a definição de volume e basear suas imagens nisso

Observe que dentro das imagens php atuais, parece que o volume foi removido, o que significa que efetivamente temos a opção 3.

Acabei de fazer um experimento com o seguinte:

FROM alpineLABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"RUN apk add --no-cache inotify-toolsCMD [ "./script.sh" ]WORKDIR /opt/app/COPY src/ /opt/app/RUN chmod a+x *.sh

E funciona muito bem.

Entanto

Quando eu substituo esse arquivo executável por meio de volumes docker-compose, o execute a permissão é simplesmente como uma reversão-tecnicamente anulada à permissão de arquivo original.

A correção para o modo dev é simplesmente para chmod a+x yourfile do host, que será herdado na montagem de volume de composição.

Certo… Eu editei a pergunta :slight_smile:

Estou vendo um espaço extra em seu último comando (estou no meu telefone, então não posso ter certeza). Como o problema de permissão parece ser com o diretório de log, altere a última linha para: ``
Executar chmod-R 777 / var / www / html / app / cache / var / www / html / app / logs

esse espaço extra era um erro de Digitação

Você resolveu o problema?

Não consigo reproduzir o seu problema. Se eu usar seu dockerfile e configurar alguns arquivos fictícios localmente, as permissões estão corretas e tudo funciona. Posso inicializar um contêiner e acessar o conteúdo por meio de um navegador da web. Você pode atualizar sua pergunta para incluir mensagens de erro específicas? Você tem certeza de sua configuração Apache ('apache2.conf`) não está causando um problema? Os erros desaparecem se você não instalar ’ apache2.conf?

Seria útil ver seu comando docker que executa a imagem construída.