Introducción
Al crear un Dockerfile, hay dos comandos que puede usar para copiar archivos/directorios en él:ADD
y COPY
. Aunque existen ligeras diferencias en el alcance de su función, esencialmente realizan la misma tarea.
Entonces, ¿por qué tenemos dos comandos y cómo sabemos cuándo usar uno u otro?
En este artículo, explicamos cada comando, analizamos Docker ADD vs COPY y te decimos cuál usar.

Comando AÑADIR de Docker
Comencemos por señalar que ADD
el comando es anterior a COPY
. Desde el lanzamiento de la plataforma Docker, ADD
instrucción ha sido parte de su lista de comandos.
El comando copia archivos/directorios a un sistema de archivos del contenedor especificado.
La sintaxis básica para ADD
el comando es:
ADD <src> … <dest>
Incluye la fuente que desea copiar (<src>
) seguido del destino donde desea almacenarlo (<dest>
). Si la fuente es un directorio, ADD
copia todo lo que contiene (incluidos los metadatos del sistema de archivos).
Por ejemplo, si el archivo está disponible localmente y desea agregarlo al directorio de una imagen, escriba:
ADD /source/file/path /destination/path
ADD
también puede copiar archivos desde una URL. Puede descargar un archivo externo y copiarlo en el destino deseado. Por ejemplo:
ADD http://source.file/url /destination/path
Una característica adicional es que copia archivos comprimidos, extrayendo automáticamente el contenido en el destino dado. Esta característica solo se aplica a archivos/directorios comprimidos almacenados localmente.
Escriba la fuente y dónde desea que el comando extraiga el contenido de la siguiente manera:
ADD source.file.tar.gz /temp
Tenga en cuenta que no puede descargar y extraer un archivo/directorio comprimido de una URL. El comando no desempaqueta los paquetes externos al copiarlos en el sistema de archivos local.
Comando Copiar Docker
Debido a algunos problemas de funcionalidad, Docker tuvo que introducir un comando adicional para duplicar contenido:COPY
.
A diferencia de su estrechamente relacionado ADD
comando, COPY
solo tiene una función asignada. Su función es duplicar archivos/directorios en una ubicación específica en su formato existente. Esto significa que no se trata de extraer un archivo comprimido, sino que lo copia tal cual.
La instrucción solo se puede utilizar para archivos almacenados localmente. Por lo tanto, no puede usarlo con URL para copiar archivos externos a su contenedor.
Para utilizar COPY
instrucción, siga el formato de comando básico:
COPY <src> … <dest>
Por ejemplo:
COPY /source/file/path /destination/path
Copia de Docker frente a AGREGAR
¿Por qué fue necesario agregar un nuevo comando similar?
El hecho de que ADD
tenía tantas funcionalidades resultó ser problemático en la práctica, ya que se comportó de manera extremadamente impredecible. El resultado de un rendimiento tan poco fiable a menudo se reducía a copiar cuando querías extraer y extraer cuando querías copiar.
Docker no pudo reemplazar completamente el comando debido a sus muchos usos existentes. Para evitar la compatibilidad con versiones anteriores, la opción más segura era agregar el COPY
comando:un comando menos diverso pero más confiable.
Cuál usar (mejores prácticas)
Teniendo en cuenta las circunstancias en las que COPY
se introdujo el comando, es evidente que mantener ADD era una cuestión de necesidad. Docker publicó un documento oficial que describe las mejores prácticas para escribir Dockerfiles, que desaconseja explícitamente el uso de ADD
comando .
La documentación oficial de Docker señala que COPY
siempre debe ser la instrucción de acceso, ya que es más transparente que ADD
.
Si necesita copiar desde el contexto de compilación local a un contenedor, use COPY
.
El equipo de Docker también desaconseja encarecidamente el uso de ADD
para descargar y copiar un paquete desde una URL. En cambio, es más seguro y eficiente usar wget o rizo dentro de un RUN
dominio. Al hacerlo, evita crear una capa de imagen adicional y ahorra espacio.
Supongamos que desea descargar un paquete comprimido desde una URL, extraer el contenido y limpiar el archivo.
En lugar de usar ADD
y ejecutando el siguiente comando:
ADD http://source.file/package.file.tar.gz /temp
RUN tar -xjf /temp/package.file.tar.gz \
&& make -C /tmp/package.file \
&& rm /tmp/ package.file.tar.gz
Deberías usar:
RUN curl http://source.file/package.file.tar.gz \
| tar -xjC /tmp/ package.file.tar.gz \
&& make -C /tmp/ package.file.tar.gz