Comment copier plusieurs fichiers dans une couche en utilisant un Dockerfile?

246

Ce qui suit Dockerfilecontient quatre COPYcouches:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

Comment copier ces fichiers en utilisant une couche à la place? Ce qui suit a été essayé:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
kazhuravlev
la source

Réponses:

427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

ou

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

Vous pouvez également utiliser des caractères génériques dans la spécification du fichier source. Voir les documents pour un peu plus de détails .

Les répertoires sont spéciaux! Si vous écrivez

COPY dir1 dir2 ./

qui fonctionne comme

COPY dir1/* dir2/* ./

Si vous souhaitez copier plusieurs répertoires (pas leur contenu) sous un répertoire de destination dans une seule commande, vous devrez configurer le contexte de génération afin que vos répertoires source soient sous un parent commun, puis COPYce parent.

Nathaniel Waisbrot
la source
53
Notez que si les sources sont des répertoires, cela copie le contenu du répertoire , pas les répertoires eux-mêmes.
Claudiu
7
Notez également que le répertoire de destination est le même. Si vous faites beaucoup de fichiers différents avec des destinations différentes, vous pouvez envisager de construire un système de fichiers en superposition (comme un chroot), puis de le transformer en tararchive et de l'ajouter avec ADD.
tu-Reinstate Monica-dor duh
4
@Claudiu Comment copier les dossiers eux-mêmes?
k0pernikus
5
@ k0pernikus vous pouvez dire COPY myDir1 ./MyDir1/
Manuel Manhart
@ manuel-manhart Y a-t-il quelqu'un qui sait si nous pouvons paramétrer la liste des fichiers à l'aide d'un paramètre de construction? github.com/moby/moby/issues/38532 ?
Marcello de Sales
52
COPY <all> <the> <things> <last-arg-is-destination>

Mais voici un extrait important de la documentation:

Si vous avez plusieurs étapes Dockerfile qui utilisent des fichiers différents de votre contexte, copiez-les individuellement, plutôt que toutes en même temps. Cela garantit que le cache de génération de chaque étape n'est invalidé (ce qui oblige à réexécuter l'étape) que si les fichiers spécifiquement requis changent.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy

swapsCAPS
la source
savez-vous si nous pouvons paramétrer "toutes les choses" ??? Vous utilisez des paramètres de construction? github.com/moby/moby/issues/38532 ???
Marcello de Sales
@MarcellodeSales ne sais pas pourquoi vous en auriez besoin. Pourquoi ne créez-vous pas une image de base sans ces fichiers, puis les images enfants contiennent l'instruction de copie - si elles doivent de toute façon définir le chemin, cela ne fait pas beaucoup de différence. Ou vous pouvez simplement le laisser complètement sur la ou les images et le monter dans le conteneur - vous avez là les fichiers .env pour le configurer.
Manuel Manhart du
De plus, vous pouvez toujours copier sur un chemin existant de toute façon, puisque le système de fichiers est en couches, il chevauchera / masquera le contenu existant.
Manuel Manhart du
@ManuelManhart, je construis une image dynamique paramétrée avec ONBUILD COPY ... Dans le cadre d'une plate-forme, je cache la complexité de ce qui doit être fait dans l'image, c'est pourquoi j'ai besoin des valeurs à fournir comme paramètre.
Marcello de Sales
@MarcellodeSales Je ne pense pas que cela soit pris en charge pour le moment / pour le moment. Mais vous pouvez utiliser des arguments de construction pour l'encapsuler, voir stackoverflow.com/questions/43654656/…
Manuel Manhart
7

Facile

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

du doc

Si plusieurs ressources sont spécifiées, directement ou en raison de l'utilisation d'un caractère générique, il doit s'agir d'un répertoire et il doit se terminer par une barre oblique /.

Edwin Ikechukwu Okonkwo
la source
6

Il peut être utile de mentionner que vous pouvez également créer un .dockerignorefichier, pour exclure les fichiers que vous ne souhaitez pas copier:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

Avant que la CLI docker envoie le contexte au démon docker, elle recherche un fichier nommé .dockerignore dans le répertoire racine du contexte. Si ce fichier existe, la CLI modifie le contexte pour exclure les fichiers et répertoires qui correspondent aux modèles qu'il contient. Cela permet d'éviter d'envoyer inutilement des fichiers et des répertoires volumineux ou sensibles au démon et de les ajouter éventuellement aux images à l'aide d'ADD ou de COPY.

Aaron
la source