Quelle est la différence entre les commandes COPY
et ADD
dans un Dockerfile, et quand devrais-je utiliser l'une sur l'autre?
COPY <src> <dest>
L'instruction COPY copiera les nouveaux fichiers depuis
<src>
et les ajoutera au système de fichiers du conteneur au chemin<dest>
ADD <src> <dest>
L'instruction ADD copiera les nouveaux fichiers à partir de
<src>
et les ajoutera au système de fichiers du conteneur à path<dest>
.
docker
dockerfile
Steve
la source
la source
COPY
exécuter à chaque exécution, car il n'a pas nécessairement accès au contexte d'origine pour récupérer le contenu.Réponses:
Vous devriez vérifier la documentation
ADD
etCOPY
pour une description plus détaillée de leurs comportements, mais en résumé, la principale différence est que celaADD
peut faire plus queCOPY
:ADD
permet<src>
d'être une URLADD
documentation indique que:Notez que les meilleures pratiques pour écrire des Dockerfiles suggèrent d'utiliser
COPY
où la magie deADD
n'est pas requise. Sinon, vous ( puisque vous avez dû rechercher cette réponse ) serez probablement surpris un jour lorsque vous comptez copierkeep_this_archive_intact.tar.gz
dans votre conteneur, mais à la place, vous pulvérisez le contenu sur votre système de fichiers.la source
If <src> is a local tar archive in a recognized compression format (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources from remote URLs are not decompressed.
Docker ADDCOPY
estRéférence directement à partir du code source .
la source
ADD
également des répertoires inexistants . Donc, bien que cela soit découragé dans tout ce fil, il a un avantage surCOPY
parce que vous n'avez pas à exécutermkdir
et à enregistrer de la frappeIl existe une documentation officielle sur ce point: Meilleures pratiques pour l'écriture de Dockerfiles
la source
COPY
, car il est plus transparent. Extrait des meilleures pratiques du fichier Docker (2014-12-15):Although ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features that are not immediately obvious.
Depuis les documents Docker:
Plus: Meilleures pratiques pour écrire des Dockerfiles
la source
Si vous souhaitez ajouter un xx.tar.gz à un
/usr/local
conteneur in, décompressez-le, puis supprimez le package compressé inutile.Pour COPIER:
Pour ajouter:
ADD prend en charge l'extraction de goudron uniquement locale. En plus, COPY utilisera trois couches, mais ADD n'utilisera qu'une seule couche.
la source
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local && rm /tmp/jdk-7u79-linux-x64.tar.gz
COPY
copie un fichier / répertoire de votre hôte vers votre image.ADD
copie un fichier / répertoire de votre hôte vers votre image, mais peut également récupérer des URL distantes, extraire des fichiers TAR, etc ...Utilisation
COPY
pour copier simplement des fichiers et / ou des répertoires dans le contexte de construction.Utiliser
ADD
pour télécharger des ressources distantes, extraire des fichiers TAR, etc.la source
Depuis les documents Docker: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy
"Bien que ADD et COPY soient fonctionnellement similaires, de manière générale, COPY est préféré. En effet, il est plus transparent que ADD. COPY ne prend en charge que la copie de base des fichiers locaux dans le conteneur, tandis que ADD possède certaines fonctionnalités prise en charge des URL distantes) qui ne sont pas immédiatement évidentes. Par conséquent, la meilleure utilisation d'ADD est l'extraction automatique des fichiers tar locaux 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 toutes en même temps. Cela garantira que le cache de génération de chaque étape n'est invalidé (forçant l'étape à être réexécutée) que si les fichiers spécifiquement requis changent.
Par exemple:
Il en résulte moins d'invalidités de cache pour l'étape RUN que si vous mettez la COPIE. / tmp / avant.
La taille de l'image étant importante, l'utilisation d'ADD pour récupérer des packages à partir d'URL distantes est fortement déconseillée; vous devriez plutôt utiliser curl ou wget. 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 devez éviter de faire des choses comme:
Et au lieu de cela, faites quelque chose comme:
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. "
la source
Source: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile :
la source
Lors de la création d'un Dockerfile, il existe deux commandes que vous pouvez utiliser pour y copier des fichiers / répertoires -
ADD
etCOPY
. Bien qu'il existe de légères différences dans l'étendue de leur fonction, ils remplissent essentiellement la même tâche.Alors, pourquoi avons-nous deux commandes et comment savoir quand utiliser l'une ou l'autre?
DOCKER
ADD
COMMANDCommençons par noter que la
ADD
commande est plus ancienne queCOPY
. Depuis le lancement de la plateforme Docker, l'ADD
instruction fait partie de sa liste de commandes.La commande copie les fichiers / répertoires dans un système de fichiers du conteneur spécifié.
La syntaxe de base de la
ADD
commande est:Il comprend la source que vous souhaitez copier (
<src>
) suivie de la destination où vous souhaitez le stocker (<dest>
). Si la source est un répertoire,ADD
copie tout ce qu'il contient (y compris les métadonnées du système de fichiers).Par exemple, si le fichier est disponible localement et que vous souhaitez l'ajouter au répertoire d'une image, vous tapez:
ADD
peut également copier des fichiers à partir d'une URL. Il peut télécharger un fichier externe et le copier vers la destination souhaitée. Par exemple:Une fonctionnalité supplémentaire est qu'il copie les fichiers compressés, extrayant automatiquement le contenu dans la destination donnée. Cette fonctionnalité s'applique uniquement aux fichiers / répertoires compressés stockés localement.
Gardez à l'esprit que vous ne pouvez pas télécharger et extraire un fichier / répertoire compressé à partir d'une URL. La commande ne décompresse pas les packages externes lors de leur copie dans le système de fichiers local.
DOCKER
COPY
COMMANDEn raison de certains problèmes de fonctionnalité, Docker a dû introduire une commande supplémentaire pour la duplication de contenu -
COPY
.Contrairement à sa
ADD
commande étroitement liée ,COPY
une seule fonction est affectée. Son rôle est de dupliquer des fichiers / répertoires dans un emplacement spécifié dans leur format existant. Cela signifie qu'il ne traite pas de l'extraction d'un fichier compressé, mais le copie tel quel.L'instruction ne peut être utilisée que pour les fichiers stockés localement. Par conséquent, vous ne pouvez pas l'utiliser avec des URL pour copier des fichiers externes dans votre conteneur.
Pour utiliser l'
COPY
instruction, suivez le format de commande de base:Tapez la source et l'endroit où vous souhaitez que la commande extrait le contenu comme suit:
Par exemple:
Quelle commande utiliser? (Meilleure pratique)
Compte tenu des circonstances dans lesquelles le
COPY
commandement a été introduit, il est évident que le maintienADD
était une nécessité. Docker a publié un document officiel décrivant les meilleures pratiques pour l'écriture de Dockerfiles, qui déconseille explicitement d'utiliser leADD
commande.La documentation officielle de Docker note que cela
COPY
devrait toujours être l'instruction principale car elle est plus transparente queADD
.Si vous devez copier du contexte de construction local dans un conteneur, respectez l'utilisation
COPY
.L'équipe Docker déconseille également fortement
ADD
de télécharger et de copier un package à partir d'une URL. Au lieu de cela, il est plus sûr et plus efficace d'utiliser wget ou curl dans uneRUN
commande. Ce faisant, vous évitez de créer une couche d'image supplémentaire et économisez de l'espace.la source
Note importante
j'ai dû
COPY
et décompresser le package java dans mon image docker. Lorsque j'ai comparé la taille d'image de docker créée à l'aide d'ADD, elle était de 180 Mo plus grande que celle créée à l'aide de COPY, tar -xzf * .tar.gz et rm * .tar.gzCela signifie que même si ADD supprime le fichier tar, il est toujours conservé quelque part. Et ça agrandit l'image !!
la source
Depuis Docker 17.05
COPY
est utilisé avec le--from
drapeau dans les builds multi-étapes les générations pour copier les artefacts des étapes de génération précédentes vers l'étape de génération actuelle.de la documentation
la source
C'est une autre façon de copier des fichiers dans une image. L'option -v crée temporairement un volume que nous avons utilisé pendant le processus de génération.
Ceci est différent des autres volumes car il monte un répertoire hôte pour la génération uniquement. Les fichiers peuvent être copiés à l'aide d'une commande cp standard.
En outre, comme curl et wget, il peut être exécuté dans une pile de commandes (s'exécute dans un seul conteneur) et ne pas multiplier la taille de l'image. ADD et COPY ne sont pas empilables car ils s'exécutent dans un conteneur autonome et les commandes suivantes sur les fichiers qui s'exécutent dans des conteneurs supplémentaires multiplieront la taille de l'image:
Avec les options définies ainsi:
Les éléments suivants s'exécuteront dans un seul conteneur:
la source
unknown shorthand flag: 'v' in -v