¿Cuál es la diferencia entre los comandos "COPIAR" y "AÑADIR" en un Dockerfile

docker dockerfile


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

COPY <src> <dest>

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

ADD <src> <dest>

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





Answer 1 icecrime


Debe consultar la documentación de ADD y COPY para obtener una descripción más detallada 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
  • Refiriéndose a los comentarios a continuación, la documentación ADD establece que:

    Si es un archivo local de alquitrán en un formato de compresión reconocido (identity,gzip,bzip2 o xz)entonces se desempaqueta como un directorio.Los recursos de las URL remotas no se descomprimen.

Tenga en cuenta que las mejores prácticas para escribir Dockerfiles sugieren usar 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 quiera copiar keep_this_archive_intact.tar.gz en su contenedor, pero en su lugar, rocíe el contenido en su sistema de archivos.




Answer 2 caike


COPY es

Lo mismo que 'ADD',pero sin el alquitrán y el manejo remoto de la URL.

Referencia directamente desde el código fuente .




Answer 3 Victor Laskin


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

Debido a que el tamaño de la imagen es importante, se desaconseja utilizar ADD para obtener paquetes de URL remotas; deberías usar curl o wget en su lugar. De esa manera, puede eliminar los archivos que ya no necesita después de que se hayan 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 elementos (archivos, directorios) que no requieren la capacidad de extracción automática de alquitrán de ADD , siempre debe usar COPY .




Answer 4 eddd


De Docker docs:

AÑADIR o COPIAR

Aunque ADD y COPY son funcionalmente similares, en general, se prefiere COPY. Eso es porque es más transparente que AGREGAR. 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 soporte remoto de URL) que no son obvias de inmediato. 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 /.

Más: Mejores prácticas para escribir Dockerfiles




Answer 5 BertLi


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

Para la 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 el TDA:

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

El ADD apoya la extracción de alquitrán sólo localmente.Además,COPY usará tres capas,pero ADD sólo usa una capa.