Ao criar um Dockerfile, existem dois comandos que você pode usar para copiar arquivos / diretórios nele - ADDe COPY. 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 ADDCOMMAND
Vamos começar observando que o ADDcomando é anterior a COPY. Desde o lançamento da plataforma Docker, a ADDinstruçã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 ADDcomando é:
ADD <src> … <dest>
Inclui a fonte que você deseja copiar ( <src>) seguida do destino onde deseja armazená-la ( <dest>). Se a origem for um diretório, ADDcopie 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 /source/file/path /destination/path
ADDtambém pode copiar arquivos de um URL. Ele pode baixar um arquivo externo e copiá-lo para o destino desejado. Por exemplo:
ADD http://source.file/url /destination/path
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.
ADD source.file.tar.gz /temp
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 COPYCOMMAND
Devido a alguns problemas de funcionalidade, o Docker teve que introduzir um comando adicional para duplicar o conteúdo - COPY.
Ao contrário de seu ADDcomando estreitamente relacionado , COPYpossui 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 COPYinstrução, siga o formato de comando básico:
Digite a fonte e onde deseja que o comando extraia o conteúdo da seguinte maneira:
COPY <src> … <dest>
Por exemplo:
COPY /source/file/path /destination/path
Qual comando usar (prática recomendada)
Considerando as circunstâncias em que o COPYcomando foi introduzido, é evidente que manter ADDera 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 do ADDcomando.
A documentação oficial do Docker observa que COPYsempre deve ser a instrução go-to, pois é mais transparente que ADD.
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 ADDpara baixar e copiar um pacote de um URL. Em vez disso, é mais seguro e eficiente usar o wget ou curl dentro de um RUNcomando. Ao fazer isso, você evita criar uma camada de imagem adicional e economiza espaço.