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

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

ADD y COPY son dos Dockerfile similares instrucciones que le permiten agregar contenido a sus imágenes en el momento de la compilación. Mientras que COPY es una copia directa de origen a destino, ADD incluye funcionalidad adicional para trabajar con archivos y URL remotas.

COPIAR

COPY es la más simple de las dos instrucciones. Acepta dos argumentos, un origen y un destino:

COPY example.txt /example/dir/example.txt

La ruta de origen se copiará desde su host Docker al sistema de archivos del contenedor. La imagen construida incluirá el archivo o directorio copiado en la ruta de destino especificada.

COPY funciona con todos los archivos y directorios, pero las rutas de origen están restringidas a aquellas dentro de su contexto de compilación activo. El contexto se establece cuando ejecuta docker build :

docker build .

# OR

docker build /path/to/context

La instrucción crea automáticamente el directorio de destino en el contenedor cuando aún no existe. Si incluye una barra diagonal final (/ ), Docker trata el destino como un directorio y colocará el archivo fuente dentro.

Puede usar comodines como *.jpg en el destino de la ruta de origen para que coincida con un conjunto de archivos. Estas expresiones se analizarán utilizando Go filepath emparejador.

Los archivos copiados tienen un UID y GID de 0 por defecto. Esto se puede personalizar con el --chown opcional indicador que acepta UID, GID y nombres. Ejecuta chown en los archivos copiados una vez que estén dentro del contenedor:

COPY --chown=my-user:my-group example.txt /example.txt

COPY también admite un --from bandera. Esto modifica la ruta de origen para hacer referencia a otro imagen del contenedor, en lugar de su contexto de compilación local. También funciona con compilaciones de varias etapas para incorporar artefactos creados en etapas de compilación anteriores.

# Copies /usr/bin/composer from the composer:latest image
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Multi-stage build example
# Stage 1: Copies example.scss from working directory into node:latest image
# Stage 2: Copies example.css built in stage 1 into the final image (based on httpd:latest)
FROM node:latest AS sass
COPY example.scss .
RUN npm install -g node-sass && node-sass example.scss example.css
FROM httpd:latest
COPY --from=sass /example.css example.css

El --from el indicador debe hacer referencia a una etapa con nombre que se enumera anteriormente en el Dockerfile . Cuando no hay una etapa coincidente, Docker asume que está haciendo referencia a una imagen en su lugar. Tendrá un error de compilación si la imagen no se puede extraer.

AGREGAR

ADD tiene la misma sintaxis que COPY , aceptando rutas de origen y destino. No hay soporte para --from pero puedes usar --chown .

A diferencia de COPY , ADD es capaz de descargar URL de archivos remotos. Si especifica una URL de acceso público como la ruta de origen, se descargará ese archivo y se agregará a la imagen del contenedor. La hora de modificación de la ruta de destino (mtime ) se establecerá en el valor de Last-Modified encabezado en la respuesta HTTP de la descarga.

ADD también puede extraer archivos tar, incluidos archivos comprimidos con gzip, bzip2 y xz. Especificar un archivo compatible como la ruta de origen desempaquetará su contenido en el directorio contenedor especificado. Se conservarán los contenidos existentes del directorio.

La detección de archivos se basa en el contenido real del archivo, no en el nombre o la extensión del archivo. Puede usar cualquier archivo original sin nombrarlo .tar , .tar.gz o .tar.xz .

La capacidad de extraer archivos automáticamente simplifica la adición de paquetes de software distribuidos como archivos tar a las imágenes de su contenedor. Proporcionar una ruta tar a COPY copiaría el archivo comprimido tal cual, no su contenido. Necesitarías usar un RUN instrucciones para descomprimir manualmente el archivo.

Los comportamientos alrededor de COPY aplicar a ADD para. A excepción de las URL remotas, las rutas de origen deben existir en su contexto de compilación. La ruta de destino del contenedor se creará automáticamente cuando no exista utilizando las reglas de Docker para la resolución de rutas.

Resumen

COPY y ADD son dos instrucciones estrechamente relacionadas pero claramente diferentes que puede usar al escribir un Dockerfile . Como sus conjuntos de funciones se superponen, es posible que se pregunte cuál es el "mejor" para usar de forma predeterminada.

De acuerdo con la guía de mejores prácticas de Docker, debe buscar COPY a menos que necesite las capacidades adicionales de ADD . ADD es una operación opaca que añade magia al proceso de copia.

Solo usando ADD cuando realmente se necesita ayuda a comunicar sus intenciones. De lo contrario, corre el riesgo de que los miembros del equipo adquieran el hábito de usar ADD que podría tener consecuencias desastrosas. Un ADD my-archive.tar . no intencional en lugar de COPY my-archive.tar podría causar confusión y compilaciones rotas cuando el contenido del archivo se muestra en su contenedor, en lugar del archivo en sí.

También debe considerar cuidadosamente cuándo es apropiado usar ADD con URL remotas. Puede ser más eficiente usar curl o wget con un RUN instrucción ya que esto ayuda a facilitar el almacenamiento en caché de la capa de imagen. Un ADD La instrucción siempre invalidará el caché para todas las siguientes etapas de compilación cuando cambie el archivo en una URL remota.

Siempre que sea posible, es una buena práctica eliminar los archivos copiados después de que se hayan utilizado. Si está descargando o extrayendo un instalador de software, eliminar el binario de una sola vez después de ejecutarlo ayudará a reducir su imagen final.


Docker
  1. ¿Cuál es la diferencia entre InnoDB y MyISAM?

  2. ¿La diferencia entre [[ $a ==Z* ]] y [ $a ==Z* ]?

  3. ¿Cuál es la diferencia entre strtok_r y strtok_s en C?

  4. ¿Cuál es la diferencia entre ls y l?

  5. ¿Cuál es la diferencia entre $(CC) y $CC?

¿Cuál es la diferencia entre el comando Cat y Touch?

¿Cuál es la diferencia entre Shell de inicio de sesión y sin inicio de sesión?

¿Cuál es la diferencia entre el comando apt y apt-get?

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

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?