Como adicionar um arquivo a um contêiner de janela de encaixe que não tem permissões de root?

16

Estou tentando adicionar um arquivo a uma imagem do Docker criada a partir da tomcatimagem oficial . Essa imagem parece não ter direitos de root, pois estou logado como usuário tomcatse executar o bash:

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

Se eu instruir a Dockerfilepara copiar um arquivo para esse contêiner, o arquivo tem permissões 644e o proprietário é root. Pelo que entendi, isso parece razoável, pois todos os comandos no Dockerfile são executados como raiz. No entanto, se eu tentar alterar a propriedade desse arquivo tomcat:tomcat, recebo um Operation not permittederro.

Por que não consigo alterar as permissões de um arquivo copiado para essa imagem?

Como pode ser reproduzido:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

A saída de docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1
Nyi
fonte

Respostas:

20

Provavelmente, existe uma maneira de visualizar e alterar o Dockerfile para tomcat, mas não consigo descobrir isso depois de alguns minutos. Minha solução deselegante é adicionar esta linha antes do chown:

USER root

Se você deseja remover os privilégios depois (o que é recomendado), você pode adicionar esta linha:

USER tomcat

Como alternativa, trabalhe com uma imagem que não possui software instalado, para que você possa iniciar o Dockerfile como root e instalar o tomcat e tudo mais. É realmente estranho que eles mudem isso em sua imagem da minha experiência. Faz sentido permitir que o usuário final pretendido defina a diretiva USER como bem entender.

theterribletrivium
fonte
Isso realmente funciona! Você sabe por que os comandos ADD e COPY criam arquivos com o proprietário root? Por que eles não levam USERem conta a diretiva?
Nyi
1
Bem, normalmente você não vê imagens básicas definindo a diretiva, pois não há uma maneira real de saber quais contas de usuário estarão no sistema. Também pode ser mais fácil criar os arquivos como root, pois é assim que o Docker deve ser executado. Parece uma solicitação de aprimoramento razoável, simplificaria a criação de Dockerfiles se as coisas pudessem pertencer automaticamente ao que foi definido na diretiva USER.
Theterribletrivium
Realmente me tirou da minha miséria. Eu precisava adicionar chaves ssh em uma imagem do Jenkins.
Kostas Demiris
8

Desde o Docker 17.09, é possível usar o --chownsinalizador nas operações ADD / COPY no Dockerfile para alterar o proprietário na própria etapa ADD / COPY, em vez de uma operação RUN separada com chown, que aumenta o tamanho da imagem como você observou. Seria bom ter isso como o modo padrão, ou seja, as permissões do usuário que copia os arquivos são aplicadas aos arquivos copiados. No entanto, a equipe do Docker não quis interromper a compatibilidade com versões anteriores e, portanto, introduziu um novo sinalizador.

COPY --chown=<user>:<group> <hostPath> <containerPath>

As outras alternativas são:

  1. Altere a permissão em uma pasta de teste antes de criar a imagem.
  2. Execute o contêiner por meio de um script de autoinicialização que altera a propriedade.
  3. Esmague as camadas!
Vinayak Gadkari
fonte