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


Quelle est la différence entre le COPY et ADD commandes dans un Dockerfile, et quand devrais-je utiliser l'un sur l'autre?


COPY <src> <dest>

L'instruction COPY va copier les nouveaux fichiers de <src> et les ajouter à   le système de fichiers du conteneur au chemin <dest>


ADD <src> <dest>

L'instruction ADD copie les nouveaux fichiers de <src> et les ajouter à la   le système de fichiers du conteneur au chemin <dest>.


1483
2017-07-25 14:31


origine


Réponses:


Vous devriez vérifier ADD et COPY documentation pour une description exhaustive de leurs comportements, mais en gros la différence majeure est que ADD peut faire plus que COPY:

  • ADD permet <src> être une URL
  • Si la <src> paramètre de ADD est une archive dans un format de compression reconnu, elle sera déballée

Notez que le Meilleures pratiques pour l'écriture de Dockerfiles suggère d'utiliser COPY où la magie de ADD n'est pas requis. Autrement vous (puisque vous deviez rechercher cette réponse) êtes susceptibles d'être surpris un jour quand vous voulez copier keep_this_archive_intact.tar.gz dans votre conteneur, mais à la place vous pulvérisez le contenu sur votre système de fichiers.


1482
2017-07-25 14:52



COPY est

Identique à 'ADD', mais sans la gestion des URL tar et distantes.

Référence directement à partir du code source.


294
2017-09-30 16:13



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, en utilisant ADD récupérer des paquets à partir d'URL distantes est fortement déconseillé; Tu devrais utiliser curl ou wget au lieu. 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 ADDCapacité d'auto-extraction de tar, vous devez toujours utiliser COPY.


116
2017-10-02 08:21



De Docker docs:

AJOUTER ou COPIER

Bien que ADD et COPY soient fonctionnellement similaires, COPY est généralement préféré. C'est parce que c'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 (telles que l'extraction de tar local uniquement et la prise en charge des URL distantes) 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 /.

Plus: Meilleures pratiques pour l'écriture de Dockerfiles


95
2017-08-10 15:19



Si vous voulez ajouter un xx.tar.gz à un /usr/local dans le conteneur, 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.


26
2018-04-25 07:07



De Docker docs: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

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


11
2018-06-12 05:29



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 !!


0
2018-06-07 08:00



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 aussi récupérer des URL distantes, extraire des fichiers TAR, etc ...

Utilisation COPY pour simplement copier des fichiers et / ou des répertoires dans le contexte de construction.

Utilisation ADD pour télécharger des ressources distantes, extraire des fichiers TAR, etc.


0
2018-05-31 12:11



docker build -t {image name} -v {host directory}:{temp build directory} .

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

Ceci est différent des autres volumes car il monte un répertoire d'hôte pour la construction uniquement. Les fichiers peuvent être copiés en utilisant une commande cp standard.

De même, 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 multiplient la taille de l'image:

Avec les options définies ainsi:

-v /opt/mysql-staging:/tvol

Les éléments suivants s'exécuteront dans un conteneur:

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

-1
2017-09-23 19:32