Como copiar o Docker como não raiz?

143

Ao criar uma imagem do Docker, como faço COPYpara inserir um arquivo na imagem para que o arquivo resultante seja de propriedade de um usuário que não seja root?

FGreg
fonte

Respostas:

206

Para as versões v17.09.0-ce e mais recentes

Use o sinalizador opcional --chown=<user>:<group>com os comandos ADDou COPY.

Por exemplo

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

A documentação para o sinalizador --chown agora está ativa na página principal de Referência do Dockerfile .

O problema 34263 foi mesclado e está disponível na versão v17.09.0-ce .


Para versões anteriores à v17.09.0-ce

O Docker não oferece suporte COPYcomo usuário que não seja root. Você precisa chown/ chmodo arquivo após o COPYcomando.

Dockerfile de exemplo:

from centos:6
RUN groupadd -r myuser && adduser -r -g myuser myuser
USER myuser
#Install code, configure application, etc...
USER root
COPY run-my-app.sh /usr/local/bin/run-my-app.sh
RUN chown myuser:myuser /usr/local/bin/run-my-app.sh && \
    chmod 744 /usr/local/bin/run-my-app.sh
USER myuser
ENTRYPOINT ["/usr/local/bin/run-my-app.sh"]

Anterior à v17.09.0-ce, a Referência do Dockerfile para o COPYcomando dizia:

Todos os novos arquivos e diretórios são criados com um UID e GID 0.


Histórico Esse recurso foi rastreado por vários problemas do GitHub: 6119 , 9943 , 13600 , 27303 , 28499 , Edição 30110 .

O problema 34263 é o problema que implementou a funcionalidade opcional do sinalizador e o problema 467 atualizou a documentação.

FGreg
fonte
3
Isso é frustrante, já que um monte de arquivos-ing chown tornou-se um incrivelmente lento desde o overlay2 tornou-se o padrão de armazenamento de motorista
hbogert
1
Sim, além disso, cria uma grande camada extra de imagem sem motivo aparente (no meu caso:> 300 MB para execução chownem 40 MB de arquivos).
Dirk
Há um benefício também para executar o chown junto com o comando COPY, que é a redução de tamanho. Se executarmos esses dois comandos separadamente (COPY <caminho_do_host> <caminho_de origem>; chown other_user: other_user), ele criará uma camada extra que eventualmente dobrará o tamanho da imagem.
abhishek thakur
Esta resposta é um salva-vidas. Muito obrigado, resolveu um problema que eu estava lutando há algumas horas.
Colby Hill