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

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.


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!
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.