GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Docker ADD vs COPY:¿Cuáles son las diferencias?

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

Docker
  1. Debian vs Ubuntu:¿Cuáles son las diferencias?

  2. 7zip, Xz, Gzip, Tar, etc., ¿cuáles son las diferencias?

  3. ¿Cuáles son las diferencias entre el kernel enviado de Ubuntu y el kernel ascendente?

  4. ¿Cuál es la diferencia entre COPIAR y AÑADIR en Dockerfiles?

  5. ¿Cuáles son las diferencias entre grep, awk y sed?

Terraform vs Kubernetes:¿Cuáles son las diferencias?

IMAP, POP3 y SMTP:¿cuáles son las diferencias?

¿Cuáles son las diferencias entre cPanel y WHM?

¿Cuál es la diferencia entre las instrucciones COPY y ADD en Dockerfile?

Docker File vs Docker Compose:¿Cuál es la diferencia?

useradd vs adduser:¿Cuáles son las diferencias?