Como adicionar um arquivo a um contêiner docker que não possui permissões de root?

12

Estou tentando adicionar um arquivo a uma imagem do Docker criada a partir da imagem oficial tomcat . Essa imagem parece não ter direitos de root, já que estou logado como usuário tomcat se eu rodar o bash:

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

Se eu instruir um Dockerfile a copiar um arquivo para esse contêiner, o arquivo terá permissões 644 e o proprietário será root . Tanto quanto eu entendo, isso parece ser razoável como todos os comandos no Dockerfile são executados como root. No entanto, se eu tentar alterar a propriedade desse arquivo para tomcat:tomcat , obtenho um erro Operation not permitted .

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

Como isso 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
    
por nyi 01.11.2014 / 00:50

2 respostas

16

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

USER root

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

USER tomcat

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

    
por 01.11.2014 / 04:33
3

Desde o Docker 17.09, é possível usar o sinalizador --chown 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 conforme você tem notado. Teria sido 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 quebrar 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 bootstrap que altere a propriedade.
  3. Esmague as camadas!
por 24.04.2018 / 15:27