Al crear un Dockerfile, hay dos comandos que puede usar para copiar archivos / directorios en él, ADD
yCOPY
. 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?
ESTIBADOR ADD
COMANDO
Comencemos notando que el ADD
comando es anterior a COPY
. Desde el lanzamiento de la plataforma Docker, elADD
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 el ADD
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 los archivos / directorios comprimidos almacenados localmente.
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.
ESTIBADOR COPY
COMANDO
Debido a algunos problemas de funcionalidad, Docker tuvo que introducir un comando adicional para duplicar contenido COPY
.
A diferencia de su ADD
comando estrechamente relacionado , 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 como está.
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 usar la COPY
instrucción, siga el formato de comando básico:
Escriba la fuente y dónde desea que el comando extraiga el contenido de la siguiente manera:
COPY <src> … <dest>
Por ejemplo:
COPY /source/file/path /destination/path
¿Qué comando usar? (Mejor práctica)
Teniendo en cuenta las circunstancias en que COPY
se introdujo el comando, es evidente que mantenerlo ADD
era una cuestión de necesidad. Docker lanzó un documento oficial que describe las mejores prácticas para escribir Dockerfiles, que explícitamente desaconseja el uso deADD
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 queADD
.
Si necesita copiar del contexto de compilación local en un contenedor, siga usando COPY
.
El equipo de Docker también desaconseja el uso ADD
para descargar y copiar un paquete desde una URL. En cambio, es más seguro y más eficiente usar wget o curl dentro de un RUN
comando. Al hacerlo, evita crear una capa de imagen adicional y ahorra espacio.