Qual é a diferença entre COPY e ADD em Dockerfiles? Como gerenciar redes Wi-Fi do Linux com Nmtui Como pesquisar alterações recentes do Git Commit Como visualizar o histórico do commit com Git Log Como enviar notificações push da Web com PHP Como monitorar Kubernetes com o painel oficial Como verificar se o Docker Daemon ou um contêiner está em execução


0

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.

Propaganda

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.

Propaganda

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.

Propaganda

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.


Like it? Share with your friends!

0

0 Comments

Your email address will not be published. Required fields are marked *