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

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

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

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

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

Como pode ser reproduzido:

mkdir docker-addfilepermissioncd docker-addfilepermissiontouch test.txtecho 'FROM tomcatCOPY test.txt /usr/local/tomcat/webapps/RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfiledocker build .

A saída de docker build .:

Sending build context to Docker daemon 3.072 kBSending build context to Docker daemon Step 0 : FROM tomcat ---> 44859847ef64Step 1 : COPY test.txt /usr/local/tomcat/webapps/ ---> Using cache ---> a2ccb92480a4Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt ---> Running in 208e7ff0ec8fchown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted2014/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

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

USER root

Se você quiser remover 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. Na verdade, é estranho que eles mudem isso em sua imagem da minha experiência. Faz sentido permitir que o usuário final pretendido defina a diretiva do usuário como achar melhor.

Desde Docker 17.09 pode-se usar o --chown sinalize nas operações Adicionar / Copiar no Dockerfile para alterar o proprietário na própria etapa Adicionar / Copiar, em vez de uma operação de execução separada com chown, que aumenta o tamanho da imagem como você observou. 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 queria 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 bootstrap que altera a propriedade.
  3. Esmague as camadas!