Pregunta ¿Cuál es la diferencia entre los comandos `COPY` y` ADD` en un Dockerfile?


¿Cuál es la diferencia entre el COPY y ADD comandos en un archivo Docker, y ¿cuándo usaría uno sobre el otro?


COPY <src> <dest>

La instrucción COPY copiará nuevos archivos de <src> y agrégalos a   el sistema de archivos del contenedor en el camino <dest>


ADD <src> <dest>

La instrucción ADD copiará nuevos archivos de <src> y agregarlos a la   sistema de archivos del contenedor en el camino <dest>.


1483
2017-07-25 14:31


origen


Respuestas:


Debes verificar ADD y COPY documentación para una descripción exhaustiva de sus comportamientos, pero en pocas palabras, la principal diferencia es que ADD puede hacer más que COPY:

  • ADD permite <src> ser una URL
  • Si el <src> parámetro de ADD es un archivo en un formato de compresión reconocido, se desempaquetará

Tenga en cuenta que Mejores prácticas para escribir Dockerfiles sugiere usar COPY donde la magia de ADD no es requerido. De lo contrario, es probable que te sorprendas (ya que tenías que buscar esta respuesta) cuando quieras copiar keep_this_archive_intact.tar.gz en su contenedor, pero en su lugar rocía los contenidos en su sistema de archivos.


1482
2017-07-25 14:52



COPY es

Igual que 'ADD', pero sin el tar y el manejo remoto de URL.

Referencia directamente desde el código fuente.


294
2017-09-30 16:13



Hay alguna documentación oficial sobre ese punto: Las mejores prácticas para escribir archivos Docker 

Porque el tamaño de la imagen importa, usando ADD obtener paquetes de direcciones URL remotas es desaconsejado enérgicamente; Deberías usar curl o wget en lugar. De esta forma, puede eliminar los archivos que ya no necesita después de haberlos extraído y no tendrá que agregar otra capa en su imagen.

RUN mkdir -p /usr/src/things \
  && curl -SL http://example.com/big.tar.gz \
    | tar -xJC /usr/src/things \
  && make -C /usr/src/things all

Para otros artículos (archivos, directorios) que no requieren ADDCapacidad de autoextracción de alquitrán, siempre debes usar COPY.


116
2017-10-02 08:21



De Docker documentos:

AGREGAR o COPIAR

Aunque ADD y COPY son funcionalmente similares, en general, se prefiere COPY. Eso es porque es más transparente que ADD. COPY solo admite la copia básica de archivos locales en el contenedor, mientras que ADD tiene algunas características (como la extracción de tar únicamente local y el soporte de URL remoto) que no son inmediatamente obvias. En consecuencia, el mejor uso para ADD es la autoextracción local de archivos tar en la imagen, como en ADD rootfs.tar.xz /.

Más: Mejores prácticas para escribir Dockerfiles


95
2017-08-10 15:19



Si desea agregar un xx.tar.gz a un /usr/local en el contenedor, descomprímalo y luego elimine el paquete comprimido inútil.

Para COPIA:

COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz

Para añadir:

ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/

ADD admite la extracción de tar solo local. Además, COPY usará tres capas, pero ADD solo usa una capa.


26
2018-04-25 07:07



De Docker documentos: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

"Aunque ADD y COPY son funcionalmente similares, en general, se prefiere COPY. Eso es porque es más transparente que ADD. COPY solo admite la copia básica de archivos locales en el contenedor, mientras que ADD tiene algunas características (como extracción de tar solo local y soporte URL remoto) que no son inmediatamente obvias. En consecuencia, el mejor uso para ADD es la extracción automática de archivos tar locales en la imagen, como en ADD rootfs.tar.xz /.

Si tiene varios pasos de Dockerfile que utilizan diferentes archivos de su contexto, COPIE de forma individual, en lugar de hacerlo todos a la vez. Esto asegurará que la caché de compilación de cada paso solo se invalide (forzando el paso a volver a ejecutar) si cambian los archivos específicamente requeridos.

Por ejemplo:

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

Produce menos invalidaciones de caché para el paso RUN, que si coloca COPY. / tmp / antes que.

Debido a que el tamaño de la imagen importa, se desaconseja encarecidamente usar ADD para recuperar paquetes de URL remotas; deberías usar curl o wget en su lugar. De esta forma, puede eliminar los archivos que ya no necesita después de haberlos extraído y no tendrá que agregar otra capa en su imagen. Por ejemplo, debe evitar hacer cosas como:

 ADD http://example.com/big.tar.xz /usr/src/things/
 RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
 RUN make -C /usr/src/things all

Y en su lugar, haz algo como:

 RUN mkdir -p /usr/src/things \
     && curl -SL htt,p://example.com/big.tar.xz \
     | tar -xJC /usr/src/things \
     && make -C /usr/src/things all

Para otros elementos (archivos, directorios) que no requieren la capacidad de extracción automática de tar mediante ADD, siempre debe usar COPY ".


11
2018-06-12 05:29



Nota IMPORTANTE

Tuve que copiar y desempaquetar el paquete java en mi imagen acoplable. Cuando comparé el tamaño de imagen de la ventana acoplable creada usando ADD, fue 180MB más grande que la creada usando COPY, tar -xzf * .tar.gz y rm * .tar.gz

Esto significa que aunque ADD elimina el archivo tar, aún se guarda en algún lugar. ¡Y está haciendo que la imagen sea grande!


0
2018-06-07 08:00



COPY copia un archivo / directorio de su host a su imagen.

ADD copia un archivo / directorio de su servidor a su imagen, pero también puede buscar URL remotas, extraer archivos TAR, etc.

Utilizar COPY para simplemente copiar archivos y / o directorios en el contexto de compilación.

Utilizar ADD para descargar recursos remotos, extraer archivos TAR, etc.


0
2018-05-31 12:11



docker build -t {image name} -v {host directory}:{temp build directory} .

Esta es otra forma de copiar archivos en una imagen. La opción -v crea temporalmente un volumen que usamos durante el proceso de compilación.

Esto es diferente de otros volúmenes porque monta un directorio de host para la compilación únicamente. Los archivos se pueden copiar usando un comando cp estándar.

Además, al igual que curl y wget, se puede ejecutar en una pila de comandos (se ejecuta en un solo contenedor) y no multiplicar el tamaño de la imagen. ADD y COPY no son apilables porque se ejecutan en un contenedor independiente y los comandos subsiguientes en los archivos que se ejecutan en contenedores adicionales multiplicarán el tamaño de la imagen:

Con las opciones establecidas así:

-v /opt/mysql-staging:/tvol

Lo siguiente se ejecutará en un contenedor:

RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \
    mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \

    mkdir /u1/mysql/mysql-files && \
    mkdir /u1/mysql/innodb && \
    mkdir /u1/mysql/innodb/libdata && \
    mkdir /u1/mysql/innodb/innologs && \
    mkdir /u1/mysql/tmp && \

    chmod 750 /u1/mysql/mysql-files && \
    chown -R mysql /u1/mysql && \
    chgrp -R mysql /u1/mysql

-1
2017-09-23 19:32