GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Docker ADD vs COPY :quelles sont les différences ?

Présentation

Lors de la création d'un Dockerfile, vous pouvez utiliser deux commandes pour y copier des fichiers/répertoires :ADD et COPY . Bien qu'il existe de légères différences dans l'étendue de leur fonction, ils effectuent essentiellement la même tâche.

Alors, pourquoi avons-nous deux commandes et comment savons-nous quand utiliser l'une ou l'autre ?

Dans cet article, nous expliquons chaque commande, analysons Docker ADD vs COPY et vous indiquons laquelle utiliser.

Commande Docker ADD

Commençons par noter que le ADD la commande est plus ancienne que COPY . Depuis le lancement de la plateforme Docker, le ADD l'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 pour le ADD la commande est :

ADD <src> … <dest>

Il inclut la source que vous souhaitez copier (<src> ) suivi 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 voulez l'ajouter au répertoire d'une image, vous tapez :

ADD /source/file/path  /destination/path

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 :

ADD http://source.file/url  /destination/path

Une fonctionnalité supplémentaire est qu'il copie les fichiers compressés, en extrayant automatiquement le contenu dans la destination donnée. Cette fonctionnalité s'applique uniquement aux fichiers/répertoires compressés stockés localement.

Saisissez la source et l'endroit où vous souhaitez que la commande extraie le contenu comme suit :

ADD source.file.tar.gz /temp

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 sur le système de fichiers local.

Commande de copie Docker

En raison de certains problèmes de fonctionnalité, Docker a dû introduire une commande supplémentaire pour dupliquer le contenu - COPY .

Contrairement à son ADD étroitement lié commande, COPY n'a qu'une seule fonction assignée. Son rôle est de dupliquer les fichiers/répertoires à un emplacement spécifié dans leur format existant. Cela signifie qu'il ne s'agit pas d'extraire un fichier compressé, mais plutôt de le copier 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 le COPY instruction, suivez le format de commande de base :

COPY <src> … <dest> 

Par exemple :

COPY /source/file/path  /destination/path 

Copie Docker contre AJOUTER

Pourquoi était-il nécessaire d'ajouter une nouvelle commande similaire ?

Le fait que ADD avait autant de fonctionnalités s'est avéré problématique dans la pratique, car il s'est comporté extrêmement imprévisible. Le résultat de performances aussi peu fiables se résumait souvent à copier quand vous vouliez extraire et extraire quand vous vouliez copier.

Docker n'a pas pu remplacer complètement la commande en raison de ses nombreuses utilisations existantes. Pour éviter la rétrocompatibilité, l'option la plus sûre était d'ajouter le COPY commande - une commande moins diversifiée mais plus fiable.

Lequel utiliser (meilleures pratiques)

Considérant les circonstances dans lesquelles le COPY commande a été introduite, il est évident que conserver ADD était une question de nécessité. Docker a publié un document officiel décrivant les meilleures pratiques pour l'écriture de Dockerfiles, qui déconseille explicitement d'utiliser le ADD commande .

La documentation officielle de Docker indique que COPY devrait toujours être l'instruction de référence car elle est plus transparente que ADD .

Si vous avez besoin de copier du contexte de construction local dans un conteneur, respectez l'utilisation de COPY .

L'équipe Docker déconseille également fortement d'utiliser ADD pour télécharger et copier un package à partir d'une URL. Au lieu de cela, il est plus sûr et plus efficace d'utiliser wget ou boucle dans un RUN commande. Ce faisant, vous évitez de créer un calque d'image supplémentaire et économisez de l'espace.

Supposons que vous souhaitiez télécharger un package compressé à partir d'une URL, extraire le contenu et nettoyer l'archive.

Au lieu d'utiliser ADD et en exécutant la commande suivante :

ADD http://source.file/package.file.tar.gz /temp
RUN tar -xjf /temp/package.file.tar.gz \
  && make -C /tmp/package.file \
  && rm /tmp/ package.file.tar.gz

Vous devez utiliser :

RUN curl http://source.file/package.file.tar.gz \
  | tar -xjC /tmp/ package.file.tar.gz \
  && make -C /tmp/ package.file.tar.gz

Docker
  1. Routeur pfSense vs Netgear :quelles sont les principales différences ?

  2. Fedora vs Ubuntu :quelles sont les principales différences ?

  3. Comment mettre à jour/ajouter un fichier dans l'image Docker

  4. Quelles sont les différences entre lsof et netstat sous Linux ?

  5. Quelles sont les différences entre rdesktop et xfreerdp ?

Terraform vs Kubernetes :quelles sont les différences

IMAP vs POP3 vs SMTP :quelles sont les différences ?

Quelles sont les différences entre cPanel et WHM ?

Quelle est la différence entre les instructions COPY et ADD dans Dockerfile ?

Docker File vs Docker Compose :quelle est la différence ?

useradd vs adduser :quelles sont les différences ?