Dockerfile : ADD ou COPY ?

Lorsque l’on écrit un ficher de construction Docker, c’est toujours la question qui se pose les premières fois que l’on veut copier un fichier ou répertoire local dans le conteneur : est-ce que je dois utiliser ADD ou COPY ?

Les deux ont la même syntaxe et permettent de copier un ou plusieurs fichiers et répertoires :

COPY/ADD <src>... <dest>
COPY/ADD ["<src>",... "<dest>"]

Ils obéissent également aux mêmes règles : par exemple, les fichiers et répertoires doivent être présents dans le contexte de la construction.

Mais alors, pourquoi ?

La différence c’est que l’instruction ADD possèdent des fonctionnalités supplémentaires :

  • ADD permet d’ajouter des sources depuis une URL, et pas seulement une source locale
  • si la source locale est une archive dans un format reconnu (gzip, bzip2, xz, …) alors ADD va automatiquement en extraire le contenu dans la destination

Donc, j’utilise toujours ADD ?

En théorie, ADD est donc un COPY avec des fonctionnalités supplémentaires. Pour autant, le guide des bonnes pratiques Docker conseille d’utiliser l’instruction COPYde préférence, pour des raisons de transparence (en gros, pour copier des fichiers, COPY c’est plus humainement clair que ADD).
De plus, l’utilisation de l’instruction ADD est fortement découragé pour les URL. La bonne pratique est de passer plutôt par l’instruction RUN wget ... car cela permet ensuite de supprimer les fichiers qui ne sont plus utiles.

Conclusion

En conclusion, je citerai la bonne pratique Docker :

Pour les fichiers et répertoires, si vous n’avez pas besoin de la fonctionnalité d’auto-extraction d’archive, vous devriez utiliser COPY.

Sources :
https://docs.docker.com/engine/reference/builder/#add
https://docs.docker.com/engine/reference/builder/#copy
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

Laisser un commentaire