docker - para - copy con cmd
¿Cuál es la diferencia entre los comandos `COPY` y` ADD` en un archivo de acoplamiento? (10)
¿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:
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 /.
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>
deADD
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.
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 usarcurl
owget
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 usarCOPY
.
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.
COPY
es
Igual que ''AGREGAR'', pero sin el tar y el manejo remoto de URL.
Referencia directamente desde el código fuente .
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.
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