57 votes

Montage du répertoire de la machine hôte au conteneur dans Docker

Comment monter un répertoire de la machine hôte vers un conteneur dans Docker ?

160voto

user2089674 Points 1155

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/

2 votes

Q : Les modifications apportées aux fichiers situés dans ces chemins fonctionneront-elles dans les deux sens ?

2 votes

@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.

10 votes

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.

13voto

Solomon Hykes Points 172

*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 :

  1. 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
  2. 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
  3. 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.

2 votes

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 .

0 votes

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 .

2 votes

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.

5voto

imiric Points 696

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 .

4voto

louisd Points 41

Trick pour OS X et Windows

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 :

  1. Monter le système local sur boot2docker :

     sudo mount -t vboxsf hostfolder /boot2dockerfolder
  2. 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

4voto

Ce site IS possible dans Docker :

Monter les données dans le conteneur d'application :

docker run -t -i -rm -volumes-from DATA -name client1 ubuntu bash

Prograide.com

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.

Powered by:

X