web-dev-qa-db-fra.com

Comment copier plusieurs fichiers dans une couche à l'aide d'un fichier Dockerfile?

La Dockerfile suivante contient quatre couches COPY:

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 ./",
]
183
kazhuravlev
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 la documentation pour un peu plus de détails .

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

COPY dir1 dir2 ./

cela fonctionne comme

COPY dir1/* dir2/* ./

Si vous souhaitez copier plusieurs répertoires (pas leur contenu) sous un répertoire de destination avec une seule commande, vous devez configurer le contexte de construction de sorte que vos répertoires source soient sous un parent commun, puis COPY ce parent. .

305
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 tous en même temps. Cela garantit que le cache de construction de chaque étape n’est invalidé (ce qui oblige à réexécuter l’étape) si les fichiers spécifiquement requis changent.

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

27
stofstik

facile

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

depuis le doc

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

6
Edwin Ikechukwu

Il peut être intéressant de mentionner que vous pouvez également créer un fichier .dockerignore pour exclure les fichiers que vous ne voulez pas copier:

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

Avant que la CLI de docker envoie le contexte au démon de 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 les répertoires correspondant 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 de l'option ADD ou COPY.

0
Aaron