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

What's Your Reaction?

hate hate
0
hate
confused confused
0
confused
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win

0 Comments

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

Choose A Format
Personality quiz
Series of questions that intends to reveal something about the personality
Trivia quiz
Series of questions with right and wrong answers that intends to check knowledge
Poll
Voting to make decisions or determine opinions
Story
Formatted Text with Embeds and Visuals
List
The Classic Internet Listicles
Countdown
The Classic Internet Countdowns
Open List
Submit your own item and vote up for the best submission
Ranked List
Upvote or downvote to decide the best list item
Meme
Upload your own images to make custom memes
Video
Youtube, Vimeo or Vine Embeds
Audio
Soundcloud or Mixcloud Embeds
Image
Photo or GIF
Gif
GIF format