Sobes.tech
Middle

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:

  • COPY copie 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.
  • ADD a 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 :

  1. Privilégiez COPY à ADD : Dans la plupart des cas, COPY suffit. Il est plus transparent, car il copie simplement des fichiers locaux. Utiliser ADD pour extraire des archives ou télécharger depuis des URLs peut être moins prévisible et augmenter la complexité de la construction.

  2. Utilisez COPY pour les fichiers locaux : Si vous devez copier des fichiers du contexte de construction vers l'image, utilisez toujours COPY.

    # Au lieu de ADD . /app
    COPY . /app 
    
  3. Faites attention aux URLs dans ADD : L'utilisation de ADD avec 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'utiliser curl ou wget dans 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
    
  4. Extrayez les archives dans une couche séparée lors de l'utilisation de ADD : Si vous devez utiliser ADD pour 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 avec RUN.

  5. 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 .dockerignore pour 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
    
  6. 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
    
  7. Variez l'ordre en fonction de la fréquence des changements : Placez les instructions COPY ou ADD pour les fichiers qui changent moins fréquemment (par exemple, les fichiers de dépendances comme package.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.