Je pense utiliser Docker pour créer mes dépendances sur un serveur d'intégration continue (CI), afin de ne pas avoir à installer tous les runtimes et bibliothèques sur les agents eux-mêmes.
Pour y parvenir, je devrais copier les artefacts de construction qui sont construits à l'intérieur du conteneur dans l'hôte. Est-ce possible?
docker
docker-container
file-copying
user2668128
la source
la source
Réponses:
Pour copier un fichier d'un conteneur vers l'hôte, vous pouvez utiliser la commande
Voici un exemple:
Ici goofy_roentgen est le nom du conteneur que j'ai obtenu de la commande suivante:
Vous pouvez également utiliser (une partie de) l' ID de conteneur . La commande suivante est équivalente à la première
la source
docker ps -alq
.docker cp ...
docker cp -L
de copier des liens symboliquesVous n'avez pas besoin d'utiliser
docker run
.Vous pouvez le faire avec
docker create
.De la documentation :
Vous pouvez donc:
Ici, vous ne démarrez jamais le conteneur. Cela m'a paru bénéfique.
la source
-ti
requis etbash
requis?Montez un "volume" et copiez-y les artefacts:
Ensuite, lorsque la génération se termine et que le conteneur n'est plus en cours d'exécution, il a déjà copié les artefacts de la génération dans le
artifacts
répertoire de l'hôte.Éditer
Avertissement: lorsque vous effectuez cette opération, vous pouvez rencontrer des problèmes avec l'ID utilisateur de l'utilisateur docker correspondant à l'ID utilisateur de l'utilisateur en cours d'exécution. Autrement dit, les fichiers dans
/artifacts
seront affichés comme appartenant à l'utilisateur avec l'UID de l'utilisateur utilisé dans le conteneur Docker. Un moyen de contourner cela peut être d'utiliser l'UID de l'utilisateur appelant:la source
chown
commande pour faire correspondre l'ID utilisateur et l'ID de groupe sur la machine hôte.Montez un volume, copiez les artefacts, ajustez l'ID du propriétaire et l'ID du groupe:
la source
TLDR;
La description
docker run
avec un volume hôte,chown
l'artefact,cp
l'artefact au volume hôte:Cette astuce fonctionne parce que l'
chown
invocation dans l' hérédoc prend des$(id -u):$(id -g)
valeurs à l'extérieur du conteneur en cours d'exécution; c'est-à-dire l'hôte docker.Les avantages sont les suivants:
docker container run --name
oudocker container create --name
avantdocker container rm
aprèsla source
cp
réponses basées sur le volume. Aussi, pour l'id
astuce pour la propriété, c'est parfois un vrai casse-têteLa plupart des réponses n'indiquent pas que le conteneur doit fonctionner avant de
docker cp
fonctionner:la source
Windows Hyper-V
, il est apparemment nécessaire d' arrêter le conteneur avant de copier un fichier .Si vous n'avez pas de conteneur en cours d'exécution, juste une image, et en supposant que vous souhaitez copier uniquement un fichier texte, vous pouvez faire quelque chose comme ceci:
la source
Je poste ceci pour toute personne utilisant Docker pour Mac. C'est ce qui a fonctionné pour moi:
Notez que lorsque je monte en utilisant
-v
cebackup
répertoire est automatiquement créé.J'espère que cela sera utile à quelqu'un un jour. :)
la source
volumes
commande à la racine de config.yml, pour que les volumes soient accessibles par plusieurs conteneurs.Si vous souhaitez simplement extraire un fichier d'une image (au lieu d'un conteneur en cours d'exécution), vous pouvez le faire:
docker run --rm <image> cat <source> > <local_dest>
Cela fera apparaître le conteneur, écrit le nouveau fichier, puis supprimera le conteneur. Un inconvénient, cependant, est que les autorisations de fichier et la date de modification ne seront pas conservées.
la source
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
la source
Avec la sortie de Docker 19.03, vous pouvez ignorer la création du conteneur et même la création d'une image. Il y a une option avec les builds basés sur BuildKit pour changer la destination de sortie. Vous pouvez l'utiliser pour écrire les résultats de la construction dans votre répertoire local plutôt que dans une image. Par exemple, voici une construction d'un go binaire:
À partir du Dockerfile ci-dessus, je construis la
artifact
scène qui inclut uniquement les fichiers que je souhaite exporter. Et le--output
drapeau nouvellement introduit me permet de les écrire dans un répertoire local au lieu d'une image. Cela doit être effectué avec le moteur BuildKit fourni avec 19.03:Une fois la construction terminée, le
app
binaire a été exporté:Docker a d'autres options pour l'
--output
indicateur documentées dans leur référentiel BuildKit en amont: https://github.com/moby/buildkit#outputla source
En tant que solution plus générale, il existe un plugin CloudBees pour Jenkins à construire dans un conteneur Docker . Vous pouvez sélectionner une image à utiliser dans un registre Docker ou définir un Dockerfile à créer et à utiliser.
Il montera l'espace de travail dans le conteneur en tant que volume (avec l'utilisateur approprié), le définira comme votre répertoire de travail, exécutera toutes les commandes que vous demandez (à l'intérieur du conteneur). Vous pouvez également utiliser le plugin docker-workflow (si vous préférez le code à l'interface utilisateur) pour ce faire, avec la commande image.inside () {}.
Fondamentalement, tout cela, intégré à votre serveur CI / CD, puis certains.
la source
J'ai utilisé PowerShell (Admin) avec cette commande.
Exemple
la source
Une autre bonne option est tout d'abord de construire le conteneur puis de l'exécuter en utilisant l'indicateur -c avec l'interpréteur de shell pour exécuter certaines virgules
La commande ci-dessus fait ceci:
-i = exécuter le conteneur en mode interactif
--rm = a supprimé le conteneur après l'exécution.
-v = a partagé un dossier en tant que volume de votre chemin d'hôte vers le chemin du conteneur.
Enfin, / bin / sh -c vous permet d'introduire une commande en tant que paramètre et cette commande copiera vos fichiers de devoirs dans le chemin du conteneur.
J'espère que cette réponse supplémentaire pourra vous aider
la source
Créez un répertoire de données sur le système hôte (en dehors du conteneur) et montez-le dans un répertoire visible de l'intérieur du conteneur. Cela place les fichiers dans un emplacement connu sur le système hôte et permet aux outils et applications du système hôte d'accéder facilement aux fichiers.
la source
Créez un chemin où vous souhaitez copier le fichier, puis utilisez:
la source
Vous pouvez utiliser à la
bind
place devolume
si vous souhaitez monter un seul dossier, et non créer un stockage spécial pour un conteneur:Construisez votre image avec le tag:
docker build . -t <image>
Exécutez votre image et liez le répertoire $ (pwd) actuel où app.py stocke et mappez-le à / root / example / à l'intérieur de votre conteneur.
docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py
la source
Cela peut également être fait dans le SDK par exemple python. Si vous avez déjà construit un conteneur, vous pouvez rechercher le nom via console (
docker ps -a
). Le nom semble être une concaténation d'un scientifique et d'un adjectif (c'est-à-dire "relax_pasteur").Découvrez
help(container.get_archive)
:Donc, quelque chose comme ça va sortir du chemin spécifié (/ sortie) dans le conteneur vers votre machine hôte et décompresser le tar.
la source