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.