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




ms cmd (9)

De los documentos de Docker:

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 solo local y la compatibilidad con URL remota) que no son evidentes de inmediato. En consecuencia, el mejor uso para ADD es la extracción automática del archivo tar local en la imagen, como en ADD rootfs.tar.xz /.

Más: Mejores prácticas para escribir Dockerfiles

¿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> .


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


Hay alguna documentación oficial sobre ese punto: Mejores prácticas para escribir archivos de Dock

Debido a que el tamaño de la imagen es importante, se desaconseja el uso de ADD para obtener paquetes de direcciones URL remotas; deberías usar curl o wget 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.

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 elementos (archivos, directorios) que no requieran la capacidad de extracción automática del tar de ADD , siempre debe usar COPY .



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.


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

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

ADD copia un archivo / directorio desde su host a su imagen, pero también puede recuperar direcciones URL remotas, extraer archivos TAR, etc.

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

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


Todas las otras respuestas son muy útiles. Acabo de pasar por el mismo problema y descubro una manera fácil con el docker machine scp .

Desde Docker Machine v0.3.0, se introdujo scp para copiar archivos de una máquina Docker a otra. Esto es muy conveniente si desea copiar un archivo desde su computadora local a una máquina Docker remota como AWS EC2 o Digital Ocean porque Docker Machine se hace cargo de las credenciales de SSH por usted.

  1. Guarda tus imágenes usando la docker save como:

    docker save -o docker-images.tar app-web
    
  2. Copia imagenes usando docker-machine scp

    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    

Suponga que su máquina Docker remota es una máquina remote-machine y el directorio en el que desea que esté el archivo tar es /home/ubuntu .

  1. Cargar la imagen de Docker.

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    




docker copy dockerfile