Quelles sont les meilleures pratiques pour utiliser les instructions ADD et COPY dans Docker?
sobes.tech IA
Réponse de l'IA
Il existe plusieurs meilleures pratiques pour les instructions ADD et COPY dans Docker, visant à améliorer la sécurité, la transparence et l'efficacité de la construction des images.
La principale différence entre ADD et COPY:
COPYcopie simplement des fichiers et des répertoires depuis la source spécifiée sur l'hôte vers la destination dans le conteneur. La source doit être un fichier ou un répertoire local.ADDa des capacités plus étendues : il peut copier des fichiers et des répertoires locaux, ainsi qu'extraire des archives (tar, gzip, bzip2) et télécharger des fichiers depuis des URLs.
Meilleures pratiques :
-
Privilégiez
COPYàADD: Dans la plupart des cas,COPYsuffit. Il est plus transparent, car il copie simplement des fichiers locaux. UtiliserADDpour extraire des archives ou télécharger depuis des URLs peut être moins prévisible et augmenter la complexité de la construction. -
Utilisez
COPYpour les fichiers locaux : Si vous devez copier des fichiers du contexte de construction vers l'image, utilisez toujoursCOPY.# Au lieu de ADD . /app COPY . /app -
Faites attention aux URLs dans
ADD: L'utilisation deADDavec une URL peut entraîner une instabilité de la construction si la ressource distante n'est pas disponible. De plus, cela peut être moins sécurisé, car vous dépendez d'une source externe. Il est préférable d'utilisercurlouwgetdans une étape séparée (RUN) pour télécharger des ressources via URL, ce qui donne plus de contrôle et permet de vérifier la somme de contrôle.# Au lieu de ADD http://example.com/file.tar.gz /tmp/ RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* \ && curl -fsSL http://example.com/file.tar.gz -o /tmp/file.tar.gz \ && tar -xzf /tmp/file.tar.gz -C /app \ && rm /tmp/file.tar.gz -
Extrayez les archives dans une couche séparée lors de l'utilisation de
ADD: Si vous devez utiliserADDpour extraire une archive (scénario moins courant), assurez-vous de le faire dans une couche séparée. Cependant, comme mentionné précédemment, il est souvent préférable d'extraire explicitement avecRUN. -
Copiez uniquement les fichiers nécessaires : Ne copiez pas tout le contexte de construction (
COPY . /app) s'il contient des fichiers inutiles (code source, données de test, répertoires cachés, etc.). Utilisez.dockerignorepour exclure ces fichiers. Cela réduit la taille de l'image et accélère la construction en diminuant la quantité de données transférées au démon Docker.Exemple de
.dockerignore:.git node_modules *.log tmp/# Copiez uniquement les fichiers nécessaires après application de `.dockerignore` COPY . /app -
Utilisez des chemins absolus pour les destinations : Indiquez toujours des chemins absolus dans l'image (/app, /usr/local/bin, etc.). Cela rend le Dockerfile plus compréhensible et prévisible, évitant l'incertitude concernant le répertoire de travail actuel (
WORKDIR).# Indiquez toujours des chemins absolus pour la destination COPY src /app/src -
Variez l'ordre en fonction de la fréquence des changements : Placez les instructions
COPYouADDpour les fichiers qui changent moins fréquemment (par exemple, les fichiers de dépendances commepackage.json,requirements.txt) en haut du Dockerfile, et celles pour les fichiers qui changent plus fréquemment (code source de l'application) en bas. Cela permet à Docker d'utiliser efficacement le cache des couches.# Fichiers de dépendances (changent moins) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Code source de l'application (change plus fréquemment) COPY . /app/
Tableau résumé :
| Instruction | Description | Utilisation recommandée | Ce qu'il faut éviter |
|---|---|---|---|
COPY |
Copie des fichiers/directoires locaux | Copier des fichiers et répertoires locaux dans l'image. | Utiliser si vous avez besoin d'extraire des archives ou de télécharger via URL. |
ADD |
Copie des fichiers/directoires locaux, extraction d'archives, téléchargement via URL | Utilisation pour l'extraction automatique d'archives (peu fréquent). | Utiliser pour copier des fichiers locaux (privilégier COPY). Utiliser pour télécharger via URL. |
Suivre ces pratiques conduit à la création d'images Docker plus fiables, plus sûres et plus efficaces.