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.