Qual é a diferença entre COPY e ADD em Dockerfiles?

ADD e COPY são duas instruções semelhantes do Dockerfile que permitem adicionar conteúdo às suas imagens no momento da construção. Considerando que COPY é uma fonte direta para a cópia de destino, ADD inclui funcionalidade extra para trabalhar com arquivos e URLs remotos.
CÓPIA
COPY é a mais simples das duas instruções. Ele aceita dois argumentos, uma origem e um destino:
COPIAR exemplo. txt /example/dir/example. txt
O caminho de origem será copiado do 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.
O 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 o docker build:
compilação do docker. # OU 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 tratará o destino como um diretório e colocará o arquivo de origem dentro dele.
Publicidade
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 combinador de caminho de arquivo Go.
Os arquivos copiados têm UID e GID de 0 por padrão. Isso pode ser personalizado com o sinalizador opcional --chown, que aceita UIDs, GIDs e nomes. Ele executa o chown nos arquivos copiados assim que eles estiverem dentro do contêiner:
COPIAR --chown = meu-usuário: meu-grupo example. txt /example. txt
COPY também suporta um sinalizador --from. Isso modifica o caminho de origem para se referir a outra imagem de contêiner, em vez de seu contexto de compilação local. Ele também funciona com compilações de vários estágios para extrair artefatos criados por estágios anteriores de compilação.
# Copia / usr / bin / composer do compositor: imagem mais recente COPY --from = composer: mais recente / usr / bin / composer / usr / bin / composer # Exemplo de compilação em vários estágios # Estágio 1: Copia example. scss do diretório de trabalho para o nó: imagem mais recente # Estágio 2: Copia example. css criado no estágio 1 para a imagem final (com base em httpd: mais recente) DO nó: AS mais recente sass COPY example. scss. EXECUTE npm install -g node-sass & & node-sass example. scss example. css DE httpd: última COPY --from = sass /example. css example. css
O sinalizador --from deve se referir a um estágio nomeado que está listado anteriormente no Dockerfile. Quando não há estágio correspondente, 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.
ADICIONE
ADD tem a mesma sintaxe de COPY, aceitando caminhos de origem e destino. Não há suporte para --from, mas você pode usar --chown.
Ao contrário do COPY, o 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. O tempo de modificação do caminho de destino (mtime) será definido com o valor do cabeçalho Last-Modified na resposta HTTP do download.
Publicidade
O 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 arquivo é 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. Fornecer um caminho tar para COPY copiaria o arquivo compactado no estado em que se encontra, não seu conteúdo. Você precisaria usar uma instrução RUN para descompactar manualmente o arquivo.
Os comportamentos em torno do COPY aplicam-se a ADICIONAR a. 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 ele 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ê deve 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 pegar o COPY, a menos que precise dos recursos extras do ADD. ADD é uma operação opaca que adiciona mágica ao processo de cópia.
Usar ADD apenas 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 pode ter consequências desastrosas. Um ADD my-archive. tar não intencional. em vez de COPY my-archive. tar pode causar confusão e compilações quebradas quando o conteúdo do arquivo aparece em seu contêiner, em vez do próprio arquivo.
Publicidade
Você também deve considerar cuidadosamente quando é apropriado usar ADD com URLs remotos. Pode ser mais eficiente usar curl ou wget com uma instrução RUN, pois isso ajuda a facilitar o armazenamento em cache da camada de imagem. Uma instrução ADD sempre invalidará o cache para todos os estágios de compilação seguintes quando o arquivo em uma URL remota for alterado.
Sempre que possível, é uma boa prática excluir os arquivos copiados depois de 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.
Nenhum comentário