Comment monter un répertoire de la machine hôte vers un conteneur dans Docker ?
Q : Les modifications apportées aux fichiers situés dans ces chemins fonctionneront-elles dans les deux sens ?
Comment monter un répertoire de la machine hôte vers un conteneur dans Docker ?
Juste pour une mise à jour finale, cette fonctionnalité est maintenant publiée dans Docker (bien que l'API ait changé depuis la pull request liée par @imiric).
Il suffit d'utiliser une commande comme
docker run -v /tmp:/root myImage
afin de monter /tmp
de la machine hôte en tant que /root
dans l'image.
Source : https://docs.docker.com/engine/userguide/dockervolumes/
Q : Les modifications apportées aux fichiers situés dans ces chemins fonctionneront-elles dans les deux sens ?
@AlixAxel oui, ils le feront. Le répertoire et les fichiers résident sur l'hôte qui est monté sur le conteneur. Vous pouvez modifier les fichiers des deux côtés et voir les changements instantanément dans les deux. J'utilise cette méthode pour intégrer du contenu dynamique dans les conteneurs sans les alourdir.
Notez que cela ne fonctionne pas comme prévu sous OS-X (et éventuellement sous Windows), car Docker utilise une image VirtualBox fonctionnant à partir d'un disque RAM comme hôte, et la commande monte donc un dossier (vide) dans l'hôte VB au sein de l'image.
*Mise à jour - voir la réponse ci-dessous. Ce n'est plus la bonne réponse*.
Vous ne pouvez pas les monter, par conception, car Docker ne pouvait plus garantir un environnement d'exécution répétable.
Cependant, vous pouvez le faire :
Importez le système de fichiers racine de l'hôte et créez une nouvelle image à partir de celui-ci :
tar -C / -c . | docker import - entend/custombase
Importe un système de fichiers racine de démarrage, par exemple le résultat de l'exécution de 'debootstrap'. (Notez que c'est de cette manière que l'image officielle "base" a été créée, il est donc préférable d'exécuter simplement "docker pull base").
debootstrap precise ./bootstrap
tar -C ./bootstrap -c . | docker import - entend/ubuntubase
Injecte le contenu d'un répertoire local dans un conteneur lors de son exécution.
IMAGE=base; SRC=./stuff; DST=/tmp/stuff; CMD="echo hello world"; tar -C $src -c . | docker run $IMAGE -i /bin/sh -c "tar -C $DST -x; $CMD"
Cela va exécuter un conteneur à partir de $IMAGE, copier le répertoire hôte $SRC dans le répertoire conteneur $DST, puis exécuter la commande $CMD.
Ce dernier exemple est généralement utilisé pour insérer le code source avant d'exécuter une commande de construction dans le conteneur.
La syntaxe pour le point 3 semble avoir changé ; la fonction -i
doit être placé avant l'image, sinon docker run essaiera de trouver l'image appelée -i
.
Lorsque je fais l'approche n°3, comment puis-je obtenir la sortie de $CMD
? Il semble que l'option -i supprime les sorties de docker run
.
En guise de mise à jour, il s'agit maintenant d'une option de première classe dans docker par le biais de l'option -v
option dans docker run
. Plus d'informations ci-dessous.
Juste pour mettre à jour cette question, cela sera bientôt possible dans Docker.
Cette demande de retrait a effectivement implémenté cette fonctionnalité et sera bientôt fusionné à master.
Vous pouvez l'utiliser dès maintenant si vous installez cette fourche .
Deux montages successifs : Je suppose que de nombreux messages ici utilisent deux boot2docker. La raison pour laquelle vous ne voyez rien est que vous montez un répertoire depuis boot2docker, et non depuis votre hôte. Vous avez besoin de deux montages successifs : le premier pour monter un répertoire de votre hôte vers votre système et le second pour monter le nouveau répertoire de boot2docker vers votre conteneur comme ceci :
Monter le système local sur boot2docker :
sudo mount -t vboxsf hostfolder /boot2dockerfolder
Monter le fichier boot2docker sur un conteneur Linux
docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
Alors quand vous le faites ls
à l'intérieur de containerfolder vous verrez le contenu de votre hostfolder
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.