docker - sintaxis - ¿Cuál es la diferencia entre los comandos `COPY` y` ADD` en un archivo de acoplamiento?




sintaxis del comando date (7)

¿Cuál es la diferencia entre los comandos COPY y ADD en un Dockerfile, y cuándo usaré uno sobre el otro?

COPY <src> <dest>

La instrucción COPY copiará los nuevos archivos de <src> y los agregará al sistema de archivos del contenedor en la ruta <dest>

ADD <src> <dest>

La instrucción AÑADIR copiará los nuevos archivos de <src> y los agregará al sistema de archivos del contenedor en la ruta <dest> .


Nota IMPORTANTE

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

Esto significa que aunque ADD elimina el archivo tar, aún se mantiene en algún lugar. Y esta haciendo la imagen mas grande !!


COPY y ADD son instrucciones de Dockerfile que sirven para propósitos similares. Le permiten copiar archivos de una ubicación específica en una imagen de Docker.

Copia toma en un src y destino. Solo le permite copiar en un archivo o directorio local desde su host (la máquina que construye la imagen de Docker) en la propia imagen de Docker.

AGREGAR le permite hacer eso también, pero también admite otras 2 fuentes. Primero, puede usar una URL en lugar de un archivo / directorio local. En segundo lugar, puede extraer un archivo tar de la fuente directamente en el destino

Un caso de uso válido para ADD es cuando desea extraer un archivo tar local en un directorio específico en su imagen de Docker.

Si está copiando en archivos locales a su imagen de Docker, siempre use COPY porque es más explícito.

Referencia: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile


De los documentos de Docker: docs.docker.com/engine/userguide/eng-image/…

"Aunque ADD y COPY son funcionalmente similares, en general, se prefiere COPY. Esto se debe a que 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 alquitrán solo local y compatibilidad con URL remotas) que no son inmediatamente obvias. En consecuencia, el mejor uso para ADD es la extracción automática de archivos tar local en la imagen, como en ADD rootfs.tar.xz /.

Si tiene varios pasos de Dockerfile que usan archivos diferentes de su contexto, COPÍELOS individualmente, en lugar de todos a la vez. Esto asegurará que la memoria caché de compilación de cada paso solo se invalide (lo que obligará a que el paso se vuelva a ejecutar) si los archivos específicamente requeridos cambian.

Por ejemplo:

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

Da como resultado menos invalidaciones de caché para el paso RUN, que si coloca la COPIA. / tmp / antes de eso.

Debido a que el tamaño de la imagen es importante, se desaconseja el uso de AGREGAR para obtener paquetes de direcciones URL remotas; deberías usar rizo o wget en su lugar. De esa manera, puede eliminar los archivos que ya no necesita después de haberlos extraído y no tendrá que agregar otra capa a su imagen. Por ejemplo, debes 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 cambio, 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 requieran la capacidad de extracción automática de tar de ADD, siempre debe usar COPY ".


Debería consultar la documentación de ADD y COPY para obtener 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 que <src> sea ​​una URL
  • Si el parámetro <src> de ADD es un archivo en un formato de compresión reconocido, se descomprimirá

Tenga en cuenta que las Mejores prácticas para escribir Dockerfiles sugieren el uso de COPY donde no se requiere la magia de ADD . De lo contrario, usted (ya que tuvo que buscar esta respuesta) es probable que se sorprenda algún día cuando keep_this_archive_intact.tar.gz copiar keep_this_archive_intact.tar.gz en su contenedor, pero en su lugar, rocíe el contenido en su sistema de archivos.


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 COPY:

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 extracción de alquitrán solo local. Además, COPY utilizará tres capas, pero ADD solo usará una capa.



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 construcción.

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

Además, al igual que el rizo y el wget, se puede ejecutar en una pila de comandos (se ejecuta en un solo contenedor) y no se multiplica el tamaño de la imagen. ADD y COPY no son apilables porque se ejecutan en un contenedor independiente y los comandos subsiguientes en aquellos 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




dockerfile