Dockerfile COPY vs ADD: principais diferenças e melhores práticas

O Docker tem duas instruções Dockerfiles similares, COPY e ADD , que são usadas para incluir arquivos em uma imagem . Este artigo explicará suas principais diferenças, bem como os motivos pelos quais o uso de COPY é a melhor prática , a menos que você queira extrair automaticamente um arquivo tar local na imagem.

CÓPIA DE

Isso copia um ou vários arquivos ou pastas locais para o destino na imagem do Docker.

  • COPY <source>... <destination>
  • COPY ["<source>",... "<destination>"] (este formulário é necessário para caminhos contendo espaço em branco)

Um exemplo Dockerfile que usa COPY

É assim que você usaria o COPY em um Dockerfile para um aplicativo Ruby.

 FROM ruby:2.5.1 
WORKDIR /usr/src/app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY . .
CMD ["./your-daemon-or-script.rb"]

Ele constrói a imagem em camadas, começando com a imagem pai ruby:2.5.1 , definida usando FROM .

A instrução do Docker WORKDIR define um diretório de trabalho para as instruções COPY ou ADD s que o seguem.

Ao copiar o Gemfiles seguido pela RUN bundle install , uma camada de imagem é criada com o Ruby Gems instalado, que pode ser armazenado em cache. As duas últimas instruções do Docker copiam os arquivos do aplicativo para a imagem e definem o comando padrão usando o CMD .

Isso significa que, se você alterar qualquer um dos arquivos do aplicativo, poderá reconstruir a imagem do Docker usando as camadas pai e intermediária armazenadas em cache. Isso é muito mais eficiente do que construir todos eles do zero.

ADICIONAR

Esta instrução tem sintaxe semelhante a COPY .

  • ADD <source>... <destination>
  • ADD ["<source>",... "<destination>"] (este formulário é necessário para caminhos contendo espaço em branco)

Além de copiar arquivos e diretórios locais para o destino na imagem do Docker, ele possui alguns recursos adicionais :

  • Se <source> for um arquivo tar local em um formato de compactação reconhecido, ele será descompactado automaticamente como um diretório para a imagem do Docker. Por exemplo: ADD rootfs.tar.xz /
  • Se o <source> for um URL, ele baixará e copiará o arquivo no destino dentro da imagem do Docker. No entanto, o Docker desencoraja o uso de ADD para essa finalidade.

Prática recomendada do Dockerfile para copiar de um URL

O Docker sugere que muitas vezes não é eficiente copiar de uma URL usando o ADD , e é uma boa prática usar outras estratégias para incluir os arquivos remotos necessários.

Como o tamanho da imagem é importante, não é recomendável usar o ADD para buscar pacotes de URLs remotos; você deve usar o curl ou wget vez disso. Dessa forma, você pode excluir os arquivos de que não precisa mais depois de terem sido extraídos e não precisa adicionar outra camada à sua imagem.
Práticas recomendadas do Dockerfile

Por exemplo, você deve evitar fazer coisas como:

 ADD http://example.com/big.tar.xz /usr/src/things/ 
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

E, em vez disso, faça algo como:

 RUN mkdir -p /usr/src/things  
&& curl -SL http://example.com/big.tar.xz
| tar -xJC /usr/src/things
&& make -C /usr/src/things all

Para outros itens (arquivos, diretórios) que não exigem o recurso de extração automática de tar do ADD , você deve sempre usar COPY .

Descubra mais

A referência oficial do Dockerfile entra em maiores detalhes nas instruções COPY , ADD e outras do Dockerfile.

Ao escrever seus Dockerfiles, a página da Web do Docker Práticas recomendadas para gravar Dockerfiles abrangem muitas outras dicas sobre como estruturar seus Dockerfiles, imagens e contêineres de maneira eficiente.

Leia mais de ryanwhocodes