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 :
- Définir la variable d'environnement
DOCKER_BUILDKIT=1
, ou - 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"