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

Quelle est la différence entre COPY et ADD dans Dockerfiles ?

ADD et COPY sont deux Dockerfile similaires instructions qui vous permettent d'ajouter du contenu à vos images au moment de la construction. Alors que COPY est une copie directe de la source à la destination, ADD inclut des fonctionnalités supplémentaires pour travailler avec des archives et des URL distantes.

COPIER

COPY est la plus simple des deux instructions. Il accepte deux arguments, une source et une destination :

COPY example.txt /example/dir/example.txt

Le chemin source sera copié de votre hôte Docker dans le système de fichiers du conteneur. L'image construite inclura le fichier ou le répertoire copié au chemin de destination spécifié.

COPY fonctionne avec tous les fichiers et répertoires, mais les chemins source sont limités à ceux de votre contexte de construction actif. Le contexte est défini lorsque vous exécutez docker build :

docker build .

# OR

docker build /path/to/context

L'instruction crée automatiquement le répertoire de destination dans le conteneur lorsqu'il n'existe pas déjà. Si vous incluez une barre oblique finale (/ ), Docker traite la destination comme un répertoire et y placera le fichier source.

Vous pouvez utiliser des caractères génériques tels que *.jpg dans la destination du chemin source pour correspondre à un ensemble de fichiers. Ces expressions seront analysées en utilisant le Go filepath correspondant.

Les fichiers copiés ont un UID et un GID de 0 par défaut. Cela peut être personnalisé avec l'option --chown drapeau qui accepte les UID, les GID et les noms. Il exécute chown sur les fichiers copiés une fois qu'ils sont dans le conteneur :

COPY --chown=my-user:my-group example.txt /example.txt

COPY prend également en charge un --from drapeau. Cela modifie le chemin source pour faire référence à un autre image de conteneur, au lieu de votre contexte de construction local. Il fonctionne également avec les builds en plusieurs étapes pour extraire les artefacts créés par les étapes de build précédentes.

# Copies /usr/bin/composer from the composer:latest image
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Multi-stage build example
# Stage 1: Copies example.scss from working directory into node:latest image
# Stage 2: Copies example.css built in stage 1 into the final image (based on httpd:latest)
FROM node:latest AS sass
COPY example.scss .
RUN npm install -g node-sass && node-sass example.scss example.css
FROM httpd:latest
COPY --from=sass /example.css example.css

Le --from flag doit faire référence à une étape nommée qui est répertoriée plus tôt dans le Dockerfile . Lorsqu'il n'y a pas d'étape correspondante, Docker suppose que vous faites référence à une image à la place. Vous rencontrerez une erreur de construction si l'image ne peut pas être extraite.

AJOUTER

ADD a la même syntaxe que COPY , acceptant les chemins source et destination. Il n'y a pas de support pour --from mais vous pouvez utiliser --chown .

Contrairement à COPY , ADD est capable de télécharger des URL de fichiers distants. La spécification d'une URL accessible au public comme chemin source téléchargera ce fichier et l'ajoutera à l'image du conteneur. L'heure modifiée du chemin de destination (mtime ) sera défini sur la valeur de Last-Modified en-tête dans la réponse HTTP du téléchargement.

ADD peut également extraire des archives tar, y compris des archives compressées avec gzip, bzip2 et xz. Spécifier une archive compatible comme chemin source décompressera son contenu dans le répertoire de conteneur spécifié. Le contenu existant du répertoire sera conservé.

La détection des archives est basée sur le contenu réel du fichier, et non sur le nom ou l'extension du fichier. Vous pouvez utiliser n'importe quel fichier d'archive authentique sans le nommer .tar , .tar.gz ou .tar.xz .

La possibilité d'extraire automatiquement des archives simplifie l'ajout de packages logiciels distribués sous forme de fichiers tar à vos images de conteneur. Fournir un chemin tar à COPY copierait le fichier d'archive compressé tel quel, pas son contenu. Vous devez utiliser un RUN instruction de décompresser manuellement le fichier.

Les comportements autour de COPY appliquer à ADD pour. À l'exception des URL distantes, les chemins source doivent exister dans votre contexte de génération. Le chemin de destination du conteneur sera automatiquement créé lorsqu'il n'existe pas en utilisant les règles de Docker pour la résolution de chemin.

Résumé

COPY et ADD sont deux instructions étroitement liées mais distinctement différentes que vous pouvez utiliser lors de l'écriture d'un Dockerfile . Comme leurs ensembles de fonctionnalités se chevauchent, vous vous demandez peut-être quel est le "meilleur" à utiliser par défaut.

Selon le propre guide des meilleures pratiques de Docker, vous devez rechercher COPY sauf si vous avez besoin des capacités supplémentaires de ADD . ADD est une opération opaque qui ajoute de la magie au processus de copie.

Utiliser uniquement ADD quand c'est vraiment nécessaire aide à communiquer vos intentions. Sinon, vous risquez d'habituer les membres de l'équipe à utiliser ADD qui pourrait avoir des conséquences désastreuses. Un ADD my-archive.tar . involontaire au lieu de COPY my-archive.tar pourrait causer de la confusion et des versions cassées lorsque le contenu de l'archive apparaît dans votre conteneur, au lieu de l'archive elle-même.

Vous devez également examiner attentivement quand il est approprié d'utiliser ADD avec des URL distantes. Il peut être plus efficace d'utiliser curl ou wget avec un RUN instruction car cela facilite la mise en cache de la couche d'image. Un ADD L'instruction invalidera toujours le cache pour toutes les étapes de construction suivantes lorsque le fichier d'une URL distante changera.

Dans la mesure du possible, il est recommandé de supprimer les fichiers copiés après leur utilisation. Si vous téléchargez ou extrayez un programme d'installation de logiciel, la suppression du fichier binaire unique après l'avoir exécuté vous aidera à affiner votre image finale.


Docker
  1. Quelle est la différence entre InnoDB et MyISAM ?

  2. Quelle est la différence entre strtok_r et strtok_s en C ?

  3. Quelle est la différence entre ls et l ?

  4. Quelle est la différence entre $(CC) et $CC ?

  5. Quelle est la différence entre la route et la route IP ?

Quelle est la différence entre le chat et la commande tactile

Quelle est la différence entre la connexion et le shell sans connexion

Quelle est la différence entre la commande apt et apt-get ?

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

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?