run - Quelle est la différence entre les commandes `COPY` et` ADD` dans un Dockerfile?




dockerfile example (6)

Quelle est la différence entre les commandes COPY et ADD dans un Dockerfile, et quand est-ce que je devrais utiliser l'une par rapport à l'autre?

COPY <src> <dest>

L'instruction COPY copiera les nouveaux fichiers de <src> et les ajoutera au système de fichiers du conteneur au chemin <dest>

ADD <src> <dest>

L'instruction ADD copiera les nouveaux fichiers de <src> et les ajoutera au système de fichiers du conteneur sur le chemin <dest> .


Note importante

J'ai dû copier et untar java package dans mon image docker. Quand j'ai comparé la taille de l'image docker créée en utilisant ADD, elle était plus grande de 180MB que celle créée en utilisant COPY, tar -xzf * .tar.gz et rm * .tar.gz

Cela signifie que même si ADD supprime le fichier tar, il est toujours conservé quelque part. Et c'est rendre l'image grande !!


À partir des documents Docker: docs.docker.com/engine/userguide/eng-image/…

"Bien que ADD et COPY soient fonctionnellement similaires, COPY est généralement préférable, car il est plus transparent que ADD COPY ne prend en charge que la copie de base des fichiers locaux dans le conteneur, alors que ADD possède certaines fonctionnalités (extraction locale de tar et support d'URL à distance) qui ne sont pas immédiatement évidentes Par conséquent, la meilleure utilisation pour ADD est l'extraction automatique de fichier tar local dans l'image, comme dans ADD rootfs.tar.xz /.

Si vous avez plusieurs étapes Dockerfile qui utilisent des fichiers différents de votre contexte, copiez-les individuellement, plutôt que tous à la fois. Cela garantira que le cache de construction de chaque étape est seulement invalidé (forçant l'étape à être relancée) si les fichiers spécifiquement requis changent.

Par exemple:

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

Résultats dans moins d'invalidations de cache pour l'étape RUN, que si vous mettez la COPIE. / tmp / avant.

Parce que la taille de l'image est importante, l'utilisation de ADD pour récupérer des paquets à partir d'URL distantes est fortement déconseillée; vous devriez utiliser curl ou wget à la place. De cette façon, vous pouvez supprimer les fichiers dont vous n'avez plus besoin après leur extraction et vous n'aurez pas à ajouter un autre calque dans votre image. Par exemple, vous devriez éviter de faire des choses comme:

 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

Et à la place, faites quelque chose comme:

 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

Pour les autres éléments (fichiers, répertoires) qui ne nécessitent pas la fonction d'extraction automatique de tar d'ADD, vous devez toujours utiliser COPY. "


Il existe une documentation officielle sur ce point: Meilleures pratiques pour l'écriture de fichiers Docker

Parce que la taille de l'image est importante, l'utilisation de ADD pour récupérer des paquets à partir d'URL distantes est fortement déconseillée; vous devriez utiliser curl ou wget place. De cette façon, vous pouvez supprimer les fichiers dont vous n'avez plus besoin après leur extraction et vous n'aurez pas à ajouter un autre calque dans votre image.

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

Pour les autres éléments (fichiers, répertoires) qui ne nécessitent pas la fonction d'extraction automatique de tar d' ADD , vous devez toujours utiliser COPY .


Si vous voulez ajouter xx.tar.gz à un conteneur /usr/local , décompressez-le, puis supprimez le package compressé inutile.

Pour COPIE:

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

Pour ajouter:

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

ADD prend en charge l'extraction de tar locale uniquement. En plus de cela, COPY utilisera trois couches, mais ADD n'utilisera qu'une seule couche.



COPY fonctionnera pour la plupart des cas.

ADD possède toutes les fonctionnalités de COPY et possède les fonctionnalités supplémentaires suivantes:

Permet l'extraction automatique du fichier tar dans l'image, par exemple,

ADD app.tar.gz /opt/var/myapp.

Permet de télécharger des fichiers à partir d'une URL distante. Cependant, les fichiers téléchargés feront partie de l'image. Cela provoque la taille de l'image à gonfler. Il est donc recommandé d'utiliser cURL ou Wget pour télécharger l'archive explicitement, extraire et supprimer l'archive.





docker