web-dev-qa-db-fra.com

Copiez plusieurs répertoires avec une seule commande

Existe-t-il un moyen de copier plusieurs répertoires dans une seule commande, afin de réduire le nombre de couches? Par exemple, au lieu de:

COPY dirone ./dirone
COPY dirtwo ./dirtwo
COPY dirthree ./dirthree

Je veux faire:

COPY dirone/ dirtwo/ dirthree/ ./

Cependant, cela copie le conten des répertoires ... mais je veux copier les répertoires eux-mêmes.

31
Claudiu

C'est le comportement documenté de la commande copy:

Si <src> est un répertoire, tout le contenu du répertoire est copié, y compris les métadonnées du système de fichiers.

Remarque: le répertoire lui-même n'est pas copié, juste son contenu.

La meilleure solution de contournement que je puisse suggérer est de modifier la disposition de votre répertoire dans votre dossier de génération, de déplacer les trois dossiers sous un dossier parent et d'ajouter le parent.

18
BMitch

Comme BMitch a répond , c'est le comportement COPY attendu.

Une alternative serait de ADD le contenu d'une archive tar.

Créer le tarball initial

tar -cvf dirs.tar dirone/ dirtwo/ dirthree/

Ajoutez-le à la build

FROM busybox
ADD dirs.tar /
CMD find /dirone /dirtwo /dirthree

L'archive tar est automatiquement extraite

○ →docker run c28f96eadd58
/dirone
/dirone/one
/dirtwo
/dirtwo/two
/dirthree
/dirthree/three

Notez que chaque fois que vous mettez à jour le fichier tar, vous invalidez le cache de construction Docker pour cette étape. Si vous traitez un grand nombre de fichiers, vous voudrez peut-être être intelligent lorsque vous effectuez la tar -c. Vous pouvez également utiliser tar -u si vous pouvez gérer les fichiers qui ne sont pas supprimés automatiquement de l'archive tar.

[ -f dirs.tar ] && tar -uf dirs.tar something || tar -cf dirs.tar something
9
Matt