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 COPY
de 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
Leave a Reply