Qual é a diferença entre os comandos COPY
e ADD
em um Dockerfile e quando eu usaria um sobre o outro?
COPY <src> <dest>
A instrução COPY copiará novos arquivos
<src>
e os adicionará ao sistema de arquivos do contêiner no caminho<dest>
ADD <src> <dest>
A instrução ADD copiará novos arquivos
<src>
e os adicionará ao sistema de arquivos do contêiner no caminho<dest>
.
docker
dockerfile
Steve
fonte
fonte
COPY
executar todas as vezes que é executado, porque não necessariamente tem acesso ao contexto original para capturar o conteúdo.Respostas:
Você deve verificar a documentação
ADD
eCOPY
para obter uma descrição mais detalhada de seus comportamentos, mas, em poucas palavras, a principal diferença é que issoADD
pode fazer mais do queCOPY
:ADD
permite<src>
ser um URLADD
documentação afirma que:Observe que as práticas recomendadas para escrever arquivos Dockerfiles sugerem usar
COPY
onde a mágica deADD
não é necessária. Caso contrário, você ( desde que você procurou esta resposta ) provavelmente ficará surpreso algum dia quando pretender copiarkeep_this_archive_intact.tar.gz
no seu contêiner, mas, em vez disso, você pulveriza o conteúdo no seu sistema de arquivos.fonte
If <src> is a local tar archive in a recognized compression format (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources from remote URLs are not decompressed.
Docker ADDCOPY
éReferência diretamente do código fonte .
fonte
ADD
também cria diretórios inexistentes . Assim, embora seja de alguma forma desanimado em toda esta discussão, tem uma vantagem sobreCOPY
porque você não tem que corrermkdir
e salvar a digitaçãoHá alguma documentação oficial sobre esse ponto: Práticas recomendadas para gravar arquivos de encaixe
fonte
COPY
, porque é mais transparente. Das práticas recomendadas do arquivo Docker (15-12-2014):Although ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features that are not immediately obvious.
Dos documentos do Docker:
Mais: Práticas recomendadas para escrever Dockerfiles
fonte
Se você deseja adicionar um xx.tar.gz a um
/usr/local
contêiner, descompacte-o e remova o pacote compactado inútil.Para COPY:
Para adicionar:
ADD suporta extração de alcatrão somente local. Além disso, COPY usará três camadas, mas ADD usa apenas uma camada.
fonte
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local && rm /tmp/jdk-7u79-linux-x64.tar.gz
COPY
copia um arquivo / diretório do seu host para a sua imagem.ADD
copia um arquivo / diretório do seu host para a sua imagem, mas também pode buscar URLs remotas, extrair arquivos TAR, etc ...Usar
COPY
simplesmente para copiar arquivos e / ou diretórios no contexto da construção.Use
ADD
para baixar recursos remotos, extrair arquivos TAR, etc.fonte
De documentos do Docker: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy
"Embora ADD e COPY sejam funcionalmente semelhantes, geralmente é preferido. Isso é porque é mais transparente que ADD. COPY suporta apenas a cópia básica de arquivos locais no contêiner, enquanto o ADD possui alguns recursos (como extração de alcatrão somente local e suporte a URL remoto) que não são imediatamente óbvios. Consequentemente, o melhor uso para o ADD é a extração automática de arquivos tar locais na imagem, como no ADD rootfs.tar.xz /.
Se você tiver várias etapas do Dockerfile que usam arquivos diferentes do seu contexto, copie-os individualmente, em vez de todos de uma vez. Isso garantirá que o cache de construção de cada etapa seja invalidado apenas (forçando a execução da etapa) se os arquivos especificamente necessários forem alterados.
Por exemplo:
Resulta em menos invalidações de cache para a etapa RUN, do que se você colocar a COPY. / tmp / antes dele.
Como o tamanho da imagem é importante, o uso do ADD para buscar pacotes de URLs remotas é altamente desencorajado; você deve usar curl ou wget. Dessa forma, você pode excluir os arquivos desnecessários após a extração e não precisará adicionar outra camada à sua imagem. Por exemplo, você deve evitar fazer coisas como:
E, em vez disso, faça algo como:
Para outros itens (arquivos, diretórios) que não exigem a capacidade de extração automática de tar do ADD, você deve sempre usar COPY. "
fonte
Fonte: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile :
fonte
Ao criar um Dockerfile, existem dois comandos que você pode usar para copiar arquivos / diretórios nele -
ADD
eCOPY
. Embora haja pequenas diferenças no escopo de sua função, eles executam essencialmente a mesma tarefa.Então, por que temos dois comandos e como sabemos quando usar um ou outro?
DOCKER
ADD
COMMANDVamos começar observando que o
ADD
comando é anterior aCOPY
. Desde o lançamento da plataforma Docker, aADD
instrução faz parte de sua lista de comandos.O comando copia arquivos / diretórios para um sistema de arquivos do contêiner especificado.
A sintaxe básica para o
ADD
comando é:Inclui a fonte que você deseja copiar (
<src>
) seguida do destino onde deseja armazená-la (<dest>
). Se a origem for um diretório,ADD
copie tudo dentro dele (incluindo os metadados do sistema de arquivos).Por exemplo, se o arquivo estiver disponível localmente e você desejar adicioná-lo ao diretório de uma imagem, digite:
ADD
também pode copiar arquivos de um URL. Ele pode baixar um arquivo externo e copiá-lo para o destino desejado. Por exemplo:Um recurso adicional é que ele copia arquivos compactados, extraindo automaticamente o conteúdo no destino especificado. Esse recurso se aplica apenas a arquivos / diretórios compactados armazenados localmente.
Lembre-se de que não é possível baixar e extrair um arquivo / diretório compactado de um URL. O comando não descompacta pacotes externos ao copiá-los para o sistema de arquivos local.
DOCKER
COPY
COMMANDDevido a alguns problemas de funcionalidade, o Docker teve que introduzir um comando adicional para duplicar o conteúdo -
COPY
.Ao contrário de seu
ADD
comando estreitamente relacionado ,COPY
possui apenas uma função atribuída. Sua função é duplicar arquivos / diretórios em um local especificado em seu formato existente. Isso significa que ele não lida com a extração de um arquivo compactado, mas o copia como está.A instrução pode ser usada apenas para arquivos armazenados localmente. Portanto, você não pode usá-lo com URLs para copiar arquivos externos para seu contêiner.
Para usar a
COPY
instrução, siga o formato de comando básico:Digite a fonte e onde deseja que o comando extraia o conteúdo da seguinte maneira:
Por exemplo:
Qual comando usar (prática recomendada)
Considerando as circunstâncias em que o
COPY
comando foi introduzido, é evidente que manterADD
era uma questão de necessidade. O Docker lançou um documento oficial descrevendo as práticas recomendadas para a criação de arquivos Docker, que desaconselha explicitamente o uso doADD
comando.A documentação oficial do Docker observa que
COPY
sempre deve ser a instrução go-to, pois é mais transparente queADD
.Se você precisar copiar do contexto de construção local para um contêiner, continue usando
COPY
.A equipe do Docker também desencoraja fortemente o uso
ADD
para baixar e copiar um pacote de um URL. Em vez disso, é mais seguro e eficiente usar o wget ou curl dentro de umRUN
comando. Ao fazer isso, você evita criar uma camada de imagem adicional e economiza espaço.fonte
Nota importante
Eu tive que
COPY
descompactar o pacote java na minha imagem do docker. Quando comparei o tamanho da imagem do Docker criada usando ADD, ela era 180MB maior que a criada usando COPY, tar -xzf * .tar.gz e rm * .tar.gzIsso significa que, embora o ADD remova o arquivo tar, ele ainda é mantido em algum lugar. E está aumentando a imagem !!
fonte
Desde o Docker 17.05
COPY
é usado com o--from
sinalizador nas construções de vários estágios para copiar artefatos dos estágios de construção anteriores para o estágio de construção atual.da documentação
fonte
Essa é outra maneira de copiar arquivos para uma imagem. A opção -v cria temporariamente um volume que usamos durante o processo de construção.
Isso é diferente dos outros volumes porque monta um diretório de host apenas para a construção. Os arquivos podem ser copiados usando um comando cp padrão.
Além disso, como curl e wget, ele pode ser executado em uma pilha de comandos (executada em um único contêiner) e não multiplicar o tamanho da imagem. ADD e COPY não são empilháveis porque são executados em um contêiner autônomo e os comandos subsequentes nos arquivos executados em contêineres adicionais multiplicam o tamanho da imagem:
Com as opções definidas assim:
O seguinte será executado em um contêiner:
fonte
unknown shorthand flag: 'v' in -v