ADD
e COPY
são dois semelhantes Dockerfile
instruções que permitem adicionar conteúdo às suas imagens no momento da construção. Enquanto que COPY
é uma fonte direta para a cópia de destino, ADD
inclui funcionalidade extra para trabalhar com arquivos e URLs remotos.
CÓPIA DE
COPY
é a mais simples das duas instruções. Ele aceita dois argumentos, uma origem e um destino:
COPY example.txt /example/dir/example.txt
O caminho de origem será copiado de seu host Docker para o sistema de arquivos do contêiner. A imagem construída incluirá o arquivo ou diretório copiado no caminho de destino especificado.
COPY
funciona com todos os arquivos e diretórios, mas os caminhos de origem são restritos àqueles dentro do seu contexto de construção ativo. O contexto é definido quando você executa docker build
:
docker build . # OR docker build /path/to/context
A instrução cria automaticamente o diretório de destino no contêiner quando ele ainda não existe. Se você incluir uma barra final (/
), O Docker trata o destino como um diretório e colocará o arquivo de origem dentro dele.
Você pode usar curingas como *.jpg
no destino do caminho de origem para corresponder a um conjunto de arquivos. Essas expressões serão analisadas usando o Go filepath
matcher.
Os arquivos copiados têm UID e GID de 0 por padrão. Isso pode ser personalizado com o opcional --chown
sinalizador que aceita UIDs, GIDs e nomes. Corre chown
nos arquivos copiados assim que estiverem dentro do contêiner:
COPY --chown=my-user:my-group example.txt /example.txt
COPY
também suporta um --from
bandeira. Isso modifica o caminho de origem para se referir a outro imagem do contêiner, em vez de seu contexto de construção local. Ele também funciona com construções de vários estágios para extrair artefatos criados por estágios de construção anteriores.
# Copies /usr/bin/composer from the composer:latest image COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Multi-stage build example # Stage 1: Copies example.scss from working directory into node:latest image # Stage 2: Copies example.css built in stage 1 into the final image (based on httpd:latest) FROM node:latest AS sass COPY example.scss . RUN npm install -g node-sass && node-sass example.scss example.css FROM httpd:latest COPY --from=sass /example.css example.css
o --from
sinalizador deve se referir a um estágio nomeado listado anteriormente no Dockerfile
. Quando não há um estágio de correspondência, o Docker presume que você está fazendo referência a uma imagem. Você encontrará um erro de compilação se a imagem não puder ser extraída.
ADICIONAR
ADD
tem a mesma sintaxe que COPY
, aceitando caminhos de origem e destino. Não há suporte para --from
mas você pode usar --chown
.
diferente COPY
, ADD
é capaz de baixar URLs de arquivos remotos. Especificar um URL acessível publicamente como o caminho de origem fará o download desse arquivo e o adicionará à imagem do contêiner. A hora de modificação do caminho de destino (mtime
) será definido com o valor de Last-Modified
cabeçalho na resposta HTTP do download.
ADD
também pode extrair arquivos tar, incluindo arquivos compactados com gzip, bzip2 e xz. Especificar um arquivo compatível como o caminho de origem descompactará seu conteúdo no diretório de contêiner especificado. O conteúdo existente do diretório será mantido.
A detecção de arquivos é baseada no conteúdo real do arquivo, não no nome do arquivo ou extensão. Você pode usar qualquer arquivo de arquivo genuíno sem nomeá-lo .tar
, .tar.gz
ou .tar.xz
.
A capacidade de extrair arquivos automaticamente simplifica a adição de pacotes de software distribuídos como arquivos tar às suas imagens de contêiner. Fornecendo um caminho de alcatrão para COPY
copiaria o arquivo compactado no estado em que se encontra, não seu conteúdo. Você precisaria usar um RUN
instrução para descompactar manualmente o arquivo.
Os comportamentos ao redor COPY
aplicar a ADD
para. Exceto para URLs remotos, os caminhos de origem devem existir em seu contexto de construção. O caminho de destino do contêiner será criado automaticamente quando não existir usando as regras do Docker para resolução de caminho.
Resumo
COPY
e ADD
são duas instruções intimamente relacionadas, mas distintamente diferentes, que você pode usar ao escrever um Dockerfile
. Como seus conjuntos de recursos se sobrepõem, você pode estar se perguntando qual é o “melhor” para usar por padrão.
De acordo com o guia de práticas recomendadas do próprio Docker, você deve buscar COPY
a menos que você precise dos recursos extras de ADD
. ADD
é uma operação opaca que adiciona mágica ao processo de cópia.
Apenas usando ADD
quando é realmente necessário, ajuda a comunicar suas intenções. Caso contrário, você corre o risco de fazer com que os membros da equipe adquiram o hábito de usar ADD
o que poderia ter consequências desastrosas. Um não intencional ADD my-archive.tar .
ao invés de COPY my-archive.tar
pode causar confusão e compilações quebradas quando o conteúdo do arquivo aparece em seu contêiner, ao invés do próprio arquivo.
Você também deve considerar cuidadosamente quando é apropriado usar ADD
com URLs remotos. Pode ser mais eficiente de usar curl
ou wget
com um RUN
instrução, pois isso ajuda a facilitar o armazenamento em cache da camada de imagem. Um ADD
a instrução sempre invalidará o cache para todos os estágios de construção seguintes quando o arquivo em uma URL remota for alterado.
Sempre que possível, é uma boa prática excluir os arquivos copiados após terem sido usados. Se você estiver baixando ou extraindo um instalador de software, excluir o binário único depois de executá-lo ajudará a reduzir sua imagem final.
0 Comments