GNU/Linux >> Tutoriels Linux >  >> Linux

Comment copier des fichiers du dockerfile vers l'hôte ?

C'est désormais possible depuis que Docker 19.03.0 a introduit en juillet 2019 des "sorties de construction personnalisées". Consultez la documentation officielle sur les sorties de build personnalisées.

Pour activer les sorties de build personnalisées à partir de l'image de build dans l'hôte pendant le processus de build, vous devez activer le BuildKit qui est une nouvelle méthode rétrocompatible recommandée pour le moteur pour effectuer la phase de construction. Consultez la documentation officielle pour activer BuildKit.

Cela peut être fait de 2 manières :

  1. Définir la variable d'environnement DOCKER_BUILDKIT=1 , ou
  2. Définissez-le dans le moteur docker par défaut en ajoutant "features": { "buildkit": true } à la racine de la configuration json.

À partir de la documentation officielle sur les sorties de build personnalisées :

les exportateurs personnalisés vous permettent d'exporter les artefacts de construction sous forme de fichiers sur le système de fichiers local au lieu d'une image Docker, ce qui peut être utile pour générer des fichiers binaires locaux, la génération de code, etc.

...

L'exportateur local écrit les fichiers de génération résultants dans un répertoire côté client. L'exportateur tar est similaire mais écrit les fichiers sous la forme d'une seule archive tar (.tar).

Si aucun type n'est spécifié, la valeur par défaut est le répertoire de sortie de l'exportateur local.

...

L'option --output exporte tous les fichiers de l'étape cible. Un modèle courant pour exporter uniquement des fichiers spécifiques consiste à effectuer des versions en plusieurs étapes et à copier les fichiers souhaités dans une nouvelle étape de travail avec COPY --from.

par exemple. un exemple de Dockerfile

FROM alpine:latest AS stage1
WORKDIR /app
RUN echo "hello world" > output.txt

FROM scratch AS export-stage
COPY --from=stage1 /app/output.txt .

Courir

DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .

La fin de la sortie est :

 => [export-stage 1/1] COPY --from=stage1 /app/output.txt .
0.0s
 => exporting to client
0.1s
 => => copying files 45B
0.1s

Cela produit un fichier local out/output.txt qui a été créé par le RUN commande.

$ cat out/output.txt
hello world

Tous les fichiers sont sortis de l'étape cible

Le --output l'option exportera tout fichiers de l'étape cible. Donc, en utilisant une étape non scratch avec COPY --from entraînera la copie de fichiers superflus dans la sortie. La recommandation est d'utiliser une étape scratch avec COPY --from .


Copier des fichiers "du Dockerfile" vers l'hôte n'est pas prise en charge. Le Dockerfile est juste une recette spécifiant comment construire une image.

Lorsque vous construisez, vous avez la possibilité de copier des fichiers de l'hôte vers l'image que vous construisez (avec le COPY directive ou ADD )

Vous pouvez également copier des fichiers depuis un conteneur (une image qui a été docker run 'd) à l'hôte avec docker cp (en fait, le cp peut également copier de l'hôte vers le conteneur)

Si vous souhaitez récupérer sur votre hôte certains fichiers qui auraient pu être générés lors de la construction (comme par exemple appeler un script qui génère ssl), vous pouvez exécuter un conteneur, monter un dossier à partir de votre hôte et exécuter des commandes cp.

Voir par exemple ce script getcrt.

docker run -u root --entrypoint=/bin/sh --rm -i -v ${HOME}/b2d/apache:/apache apache << COMMANDS
pwd
cp crt /apache
cp key /apache
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /apache/crt
chown -R $(id -u):$(id -u) /apache/key
COMMANDS

Tout entre COMMANDS sont des commandes exécutées sur le conteneur, y compris cp ceux qui sont copiés sur l'hôte ${HOME}/b2d/apache dossier, monté dans le conteneur en tant que /apache avec -v ${HOME}/b2d/apache:/apache .

Cela signifie que chaque fois que vous copiez quoi que ce soit sur /apache dans le conteneur, vous copiez en fait en ${HOME}/b2d/apache sur l'hôte !


Bien qu'il ne soit pas directement pris en charge via le Dockerfile fonctionnalité, vous pouvez copier des fichiers à partir d'une image docker construite.

containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"

Linux
  1. Comment rechercher et copier certains types de fichiers d'un répertoire à un autre sous Linux

  2. Comment copier plusieurs fichiers simultanément à l'aide de scp

  3. Comment puis-je copier des fichiers d'un serveur Google Cloud Compute sur ma machine locale ?

  4. Comment empêcher un processus d'écrire des fichiers

  5. Comment supprimer les caractères invalides des noms de fichiers ?

Comment copier un grand nombre de fichiers sous Linux

Comment télécharger des fichiers à partir de serveurs Linux distants

Comment copier des fichiers sous Linux à l'aide de la commande CP

Comment construire le noyau Linux à partir de zéro

Comment utiliser Docker Cp pour copier des fichiers entre l'hôte et les conteneurs

Comment copier des fichiers entre l'hôte et le conteneur Docker