Al crear un Dockerfile, hay dos comandos que puede usar para copiar archivos / directorios en él, ADDyCOPY . 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 ADDcomando 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 ADDcomando 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
ADDTambié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 ADDcomando estrechamente relacionado , COPYsolo 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 COPYinstrucció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 COPYse introdujo el comando, es evidente que mantenerlo ADDera 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 COPYsiempre 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 ADDpara 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 RUNcomando. Al hacerlo, evita crear una capa de imagen adicional y ahorra espacio.