Comment monter un répertoire hôte dans un conteneur Docker

618

J'essaie de monter un répertoire hôte dans un conteneur Docker afin que toutes les mises à jour effectuées sur l'hôte soient reflétées dans les conteneurs Docker.

Où est-ce que je fais quelque chose de mal? Voici ce que j'ai fait:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root@0f17e2313a46:/test_container# exit exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • Je ne sais pas comment vérifier la version de boot2docker

Questions, problèmes rencontrés:

  1. Comment dois-je lier le dossier principal au dossier test_container présent à l'intérieur du conteneur Docker?
  2. Je dois le faire automatiquement. Comment faire cela sans vraiment utiliser lerun -d -v commande?
  3. Que se passe-t-il si le boot2docker plante? Où sont stockés les fichiers Docker (à l'exception de Dockerfile)?
Kishore Vaishnav
la source
2
Pour info, cela semble être corrigé dans docker à partir de ce commentaire. J'utilise boot2docker sur mon mac. Je peux utiliser l'option -v et mon répertoire local est monté complètement dans le conteneur.
Marco

Réponses:

509

Vous pouvez procéder de plusieurs manières. La façon la plus simple de le faire est d'utiliser la ADDcommande dockerfile comme ceci:

ADD . /path/inside/docker/container

Cependant, toute modification apportée à ce répertoire sur l'hôte après la création du dockerfile n'apparaîtra pas dans le conteneur. En effet, lors de la construction d'un conteneur, docker compresse le répertoire dans a .taret télécharge ce contexte dans le conteneur de manière permanente.

La deuxième façon de procéder consiste à essayer de monter un volume. Étant donné que vous essayez d'être aussi portable que possible, vous ne pouvez pas mapper un répertoire hôte sur un répertoire de conteneur Docker dans un fichier Docker, car le répertoire hôte peut changer en fonction de la machine sur laquelle vous exécutez. Pour mapper un répertoire hôte sur un répertoire de conteneur Docker, vous devez utiliser l' -vindicateur lorsque vous utilisez Docker Run comme ceci:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run
nhjk
la source
J'ai essayé comme ceci kishore $ docker -v / Users / kishore / main_folder: / test_container Docker version 0.9.1, build 867b2a9 kishore $ docker run -v / Users / kishore / main_folder: / test_container Utilisation: docker run [OPTIONS] IMAGE [ COMMANDE] [ARG ...] Exécutez une commande dans un nouveau conteneur -P, --publish-all = false: Publiez tous les ports exposés sur les interfaces hôtes -a, --attach = []: Attachez à stdin, stdout ou stderr. -c, --cpu-share = 0: partages CPU (poids relatif)
Kishore Vaishnav
2
pouvez-vous avoir les deux ADD. et -v monter le volume en même temps. utiliser app_dir par défaut sinon spécifier un montage hôte?
alexzg
@alexzg Je ne pense pas que nous ne pouvons avoir que la première priorité. De plus, je ne suis pas sûr de votre deuxième point par défaut app_dir ... host mount ..?
Kishore Vaishnav
35
Cela a fonctionné pour moi sur mac os x avec docker-machine et VirtualBox. Une mise en garde que j'ai découverte par essais et erreurs est que le répertoire hôte doit être un chemin complet et non un chemin relatif.
jbustamovej
25
ADDn'est en fait pas "monté", il copie le fichier dans le conteneur en le conservant à l'intérieur.
kev
200

L'utilisateur de cette question utilisait Docker version 0.9.1, build 867b2a9, je vais vous donner une réponse pour la version docker> = 17.06.

Ce que vous voulez, garder le répertoire local synchronisé dans le répertoire du conteneur, est accompli en montant le volume avec le type bind. Cela liera les répertoires source (votre système) et cible (dans le conteneur Docker). C'est presque la même chose que de monter un répertoire sur Linux.

Selon la documentation Docker , la commande appropriée à monter est désormais à la mountplace de -v. Voici sa documentation:

  • --mount: Se compose de plusieurs paires clé-valeur, séparées par des virgules. Chaque paire clé / valeur prend la forme d'un <key>=<value>tuple. le--mount syntaxe est plus détaillée que -vor --volume, mais l'ordre des clés n'est pas significatif et la valeur de l'indicateur est plus facile à comprendre.

  • Le typede la montagne, qui peut être bind, volumeou tmpfs.(Nous allons utiliser bind )

  • le source de la monture. Pour les montages de liaison, il s'agit du chemin d'accès au fichier ou au répertoire sur l'hôte du démon Docker. Peut être spécifié comme sourceou src.

  • Le destinationprend comme valeur le chemin où le fichier ou le répertoire sera monté dans le conteneur. Peut être spécifié commedestination , dstou target.

Donc, pour monter le répertoire courant (source) avec /test_container (cible), nous allons utiliser:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

Si ces paramètres de montage ont des espaces, vous devez mettre des guillemets autour d'eux. Quand je sais qu'ils ne le font pas, j'utiliserais`pwd` place:

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

Vous devrez également gérer l'autorisation de fichier, consultez cet article .

Eduardo Santana
la source
2
J'ai voté pour votre réponse parce que j'aime sa concision et qu'elle n'est pas fausse, mais vous voudrez peut-être la mettre à jour à la lumière de ma réponse sur stackoverflow.com/a/51829247/901899
rainabba
2
Je suppose que la documentation a été mise à jour depuis cette réponse, car en ce moment, elle semble recommander des volumes plutôt que des montages. Ça vaut le coup, avant de s'engager sur quoi que ce soit.
Sipty
1
@Sipty peut faire référence à ce qui suit: " Si vous développez de nouvelles applications Docker, envisagez plutôt d' utiliser des volumes nommés . Vous ne pouvez pas utiliser les commandes CLI Docker pour gérer directement les montages de liaison. "
Aluthren
81

2 montages successifs: Je suppose que de nombreux articles ici peuvent utiliser deux boot2docker, la raison pour laquelle vous ne voyez rien est que vous montez un répertoire à partir de boot2docker, pas à partir de votre hôte.

Vous avez essentiellement besoin de 2 montures successives:

le premier à monter un répertoire de votre hôte sur votre système

le second pour monter le nouveau répertoire de boot2docker dans votre conteneur comme ceci:

  • 1) Montez le système local sur boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Montez le boot2dockerfichier sur le conteneur Linux

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

Ensuite, lorsque vous lsà l'intérieur du, containerfoldervous verrez le contenu de votre hostfolder.

louis V
la source
1
Meilleure réponse. Je dois ajouter que (sous Windows) le dossier hôte dans la commande de montage fait référence à un nom de partage de dossier. Celui qui apparaît avec une net sharecommande dans un terminal Windows (cmd). Et vous devez ajouter celui-ci en tant que dossier partagé avec l'interface graphique de virtualBox (en utilisant le même nom si vous suivez ma logique). Si vous omettez de le partager, cela fonctionnera, mais vous rencontrerez des problèmes d'autorisations et d'actualisation des performances.
Kir Kanos
comment la commande mount connaît-elle l'hôte où se trouve / boot2dockerfolder?
alfonsodev
J'ai eu l'erreur mount: unknown filesystem type 'vboxsf'
:, en
"vboxsf" est le pilote du "système de fichiers" du dossier partagé VirtualBox. Il doit être configuré dans la VM en installant les extensions VirtualBox. L'image boot2docker ne doit pas être installée. VirtualBox a une fonction "périphérique" pour "insérer" les images ISO VirtualBox Additions en tant que volume virtuel. En général, vous pouvez monter ceci sur le montage en utilisant mount / dev / cdrom / mnt, en allant dans / mnt et en exécutant bash VBoxLinuxAdditions. Il peut nécessiter l'installation de gcc, du noyau ou d'autres dépendances.
Andrew Wolfe
mount.vboxsf: montage a échoué avec l'erreur: Aucun fichier ou répertoire de montage: montage sur mymapfoldername / boot2dockerfolder a échoué: Aucun fichier ou répertoire
Vee
71

vous pouvez utiliser l'option -v de cli, cette fonctionnalité n'est pas disponible via Dockerfile

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

où rép_hôte est le répertoire de l'hôte que vous souhaitez monter. vous n'avez pas à vous soucier du répertoire du conteneur s'il n'existe pas, docker le créera.

Si vous effectuez des modifications dans host_dir à partir de la machine hôte (sous le privilège root), il sera visible par le conteneur et vice versa.

rgaut
la source
6
Quel bel exemple, propre et précis, pour illustrer l'option de montage de l'hôte. Il pourrait peut-être être amélioré en utilisant le vrai répertoire: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashoù l'hôte /tmpsera monté sur le conteneur /tmp. Maintenant, on peut à touch /tmp/hello-worldpartir du conteneur et voir le fichier apparaître sur l'hôte.
Stephan Henningsen
3
Fonctionne parfaitement. Mais le montage de cette manière définit le propriétaire du répertoire en tant que root et cela attend également que le conteneur soit exécuté en tant que root. Comment monter le répertoire en tant que non root lorsque le conteneur est exécuté en tant que non root?
Arun
33

Est-il possible que vous utilisiez Docker sur OS X via boot2docker ou quelque chose de similaire.

J'ai fait la même expérience - la commande est correcte mais rien (sensible) n'est monté dans le conteneur, de toute façon.

Il s'avère que cela est déjà expliqué dans la documentation du docker . Lorsque vous tapez, docker run -v /var/logs/on/host:/var/logs/in/container ...il /var/logs/on/hostest mappé à partir de l' boot2dockerimage de la machine virtuelle, pas de votre Mac.

Vous devrez diriger le dossier partagé via votre machine virtuelle vers votre hôte réel (le Mac dans mon cas).

user3680997
la source
1
Merci! Cela m'a aidé avec un problème éloigné. Postgres fonctionnant à l'intérieur de Docker était lié à la VBox IP, pas à l'hôte local, comme il l'aurait fait s'il ne fonctionnait pas sur OS X.
Peter Becich
2
Cette URL vers la documentation du docker n'est plus valide
digitaldavenyc
haha la meilleure blague de tous les temps ... ils auraient vraiment pu faire un indice.
user2834172
2
Votre lien de documentation est un 404
Factor Mystic
3
Je suis curieux de voir un exemple de canalisation du dossier partagé via la machine virtuelle vers l'hôte réel.
Derek
28

[MISE À JOUR] Depuis ~ juin 2017, Docker pour Mac s'occupe de toutes les parties ennuyeuses de cela où vous devez jouer avec VirtualBox. Il vous permet de mapper pratiquement tout sur votre hôte local en utilisant le /privatepréfixe. Plus d'infos ici . [/MISE À JOUR]

Toutes les réponses actuelles parlent de Boot2docker. Étant donné que c'est désormais obsolète au profit de docker-machine, cela fonctionne pour docker-machine:

Tout d'abord, ssh dans le docker-machine vm et créez le dossier auquel nous allons mapper:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

Partagez maintenant le dossier sur VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Enfin, réinstallez ssh dans la station d'accueil et montez le dossier que nous venons de partager:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Remarque: pour UID et GID, vous pouvez essentiellement utiliser les entiers tant qu'ils ne sont pas déjà pris.

Ceci est testé en tant que docker-machine 0.4.1 et docker 1.8.3 sur OS X El Capitan.

Eli
la source
1
+1. Après plusieurs heures à me cogner la tête, votre réponse a fonctionné. Cela devrait faire partie du docker-machinedoc.
Abhijit Sarkar
Pourquoi ne pas utiliser le -vdrapeau?
igracia
1
@igracia the -v drapeau ne fonctionne pas comme vous vous attendez sous OS X (ou Windows). Docker s'exécute dans une machine virtuelle de sorte que le dossier référencé -vpointe vers un dossier dans la machine virtuelle, pas dans le système d'exploitation racine. Cette technique prend l'étape suivante de mappage du dossier VM vers le système d'exploitation racine.
Patrick Gunderson
1
@PatrickGunderson Dans mon cas (OS X), le dossier est dans l'hôte, pas dans la machine virtuelle, et cela fonctionne très bien. Docker Tolls s'occupe de l'exporter vers la VM, et de là vers le conteneur.
igracia
1
La seule exception à la règle que j'ai mentionnée est que la machine virtuelle sera automatiquement montée /Userspour être partagée avec Docker. Cela signifie que si vos fichiers de travail sont ~/*dedans, vous êtes prêt à partir. Si vous avez une configuration de votre environnement de développement à court de /developmentou quoi que /Usersce soit d'autre que vous allez avoir des problèmes docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson
27

J'essaie simplement de faire fonctionner mon application SailsJS dans un conteneur Docker pour garder ma machine physique propre.

J'utilise la commande suivante pour monter mon application SailsJS / NodeJS sous / app:

cd my_source_code_folder
docker run -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc
Sven
la source
5
Comment faire cela dans le Dockerfile?
orad
23
docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

Dans mon système, j'ai corrigé la réponse de nhjk, cela fonctionne parfaitement lorsque vous ajoutez le -tdrapeau.

Ali
la source
Êtes-vous en mesure de créer / mettre à jour des fichiers à partir de FS local et de voir les modifications à l'intérieur du conteneur Docker?
Avi Mehenwal du
14

Si l'hôte est Windows 10, au lieu d'une barre oblique, utilisez une barre oblique inverse -

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

Assurez-vous que le lecteur hôte est partagé (C dans ce cas). Dans mon cas, j'ai reçu une invite demandant l'autorisation de partage après avoir exécuté la commande ci-dessus.

Duke79
la source
13

Sous Mac OS, pour monter un dossier /Users/<name>/projects/sur votre Mac à la racine de votre conteneur:

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects

bormat
la source
11

Mise à jour de juillet 2015 - boot2docker prend désormais en charge le montage direct. Vous pouvez utiliser -v /var/logs/on/host:/var/logs/in/containerdirectement depuis votre invite Mac, sans double montage

Tal
la source
11

Pour les utilisateurs de Windows 10 , il est important d'avoir le point de montage dans le C:/Users/répertoire. J'ai essayé pendant des heures pour que cela fonctionne. Ce message a aidé mais ce n'était pas évident au début car la solution pour Windows 10 est un commentaire à une réponse acceptée. Voici comment je l'ai fait:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

Ensuite, pour le tester, vous pouvez le faire à l' echo TEST > hostTest.txtintérieur de votre image. Vous devriez pouvoir voir ce nouveau fichier dans le dossier hôte local à l'adresse C:/Users/C/Desktop/dockerStorage/.

KF
la source
Les doubles barres obliques sur le chemin l'ont fait fonctionner pour moi. C'était déroutant parce que j'ai utilisé en -v $(pwd):/var/xxpremier et cela a fonctionné, mais a abouti à un répertoire vide. Je lance cyg via babun.
kenchilada
A eu le même problème dans Windows 7 lors de l'utilisation de / c / data /, le déplacement du répertoire hôte sous / c / Users / <user> / l'a résolu pour moi. Merci.
user8675309
1
pouvons-nous avoir un lien vers le message qui vous a aidé à résoudre le problème?
PBo
11

J'ai eu le même problème. Ma ligne de commande ressemblait à ceci:

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

Le problème était avec 'pwd'. J'ai donc changé cela en $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
NikitQa
la source
1
À quoi ça sert z?
hhh
2
L'option z indique que le contenu du montage de liaison est partagé entre plusieurs conteneurs.
Jason
10

À partir de Docker 18-CE, vous pouvez utiliser docker run -v /src/path:/container/pathpour effectuer une liaison bidirectionnelle d'un dossier hôte.

Cependant, il existe un problème majeur si vous travaillez avec Windows 10 / WSL et que Docker-CE pour Windows est votre hôte, puis les outils client Docker-ce dans WSL. WSL connaît tout le système de fichiers / tandis que votre hôte Windows ne connaît que vos disques. Dans WSL, vous pouvez utiliser / mnt / c / projectpath, mais si vous essayez docker run -v ${PWD}:/projectpath, vous trouverez dans l'hôte que / projectpath / est vide car sur l'hôte / mnt ne signifie rien.

Si vous travaillez à partir de / c / projectpath cependant et ALORS le faites docker run -v ${PWD}:/projectpathet vous constaterez que dans le conteneur, / projectpath reflètera / c / projectpath en temps réel. Il n'y a aucune erreur ni aucun autre moyen de détecter ce problème autre que de voir des montages vides à l'intérieur de votre invité.

Vous devez également être sûr de «partager le lecteur» dans les paramètres Docker pour Windows.

rainabba
la source
J'ai ce problème avec Win10 / WSL et Docker-CE / docker-ce. Vide / chemin_projet /. Qu'entendez-vous par «travailler à partir de / c / projectpath»? J'ai essayé de lier / c / à / mnt / c et d'exécuter à partir de /c/projectpathmais j'obtiens l'erreur bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder
Ce lien a résolu mon problème: support.divio.com/local-development/docker/… (Docker sur Windows autorise uniquement le montage à partir de / Users / par défaut)
Steven T. Snyder
7

Je trouve que tout répertoire portant application de la directive du système comme /var, /usr, /etcne pouvait pas être monter sous le conteneur.

La directive doit se trouver sur le -vcommutateur d' espace de l'utilisateur et indique au démon docker de monter le répertoire local sur le conteneur, par exemple:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}
Mansur Ali
la source
5

boot2docker avec VirtualBox Guest Additions
Comment monter / Utilisateurs dans boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr Créez votre propre boot2docker.iso personnalisé avec VirtualBox Guest Additions (voir le lien ) ou téléchargez http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso et enregistrez-le à ~ / .boot2docker / boot2docker.iso.

mattes
la source
J'ai essayé d'utiliser cet iso et je suis toujours tombé sur les mêmes problèmes ... L'utilisation des instructions décrites dans ce message m'a cependant aidé à le trier - j'ai essentiellement dû forcer le dossier partagé.
Jaco Pretorius
J'ai utilisé l'iso, il a trébuché en ce que je n'avais pas arrêté la machine virtuelle Virtual Box avant d'appeler le cmd 'VBoxManage sharedfolder add ...'. Enfin, tout a fonctionné, mais merci énormément.
Emile
Remarque: la raison pour laquelle l'argument -v ne fonctionne pas via boot2docker est apparemment liée au montage sur boot2docker-vm et non à votre hôte réel. c'est pourquoi je suppose que la partie Vboxmanage l'aide à fonctionner.
Emile
5

Comment lier le dossier principal au dossier test_container présent à l'intérieur du conteneur Docker?

Votre commande ci-dessous est correcte, sauf si vous êtes sur un Mac utilisant boot2docker (en fonction des futures mises à jour), auquel cas vous pouvez trouver le dossier vide. Voir la réponse des mats pour un didacticiel sur la correction de ce problème.

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

J'ai besoin de faire ça automatiquement, comment faire sans vraiment utiliser la commande run -d -v.

Vous ne pouvez pas vraiment vous éloigner de l'utilisation de ces commandes, elles sont intrinsèques au fonctionnement du docker. Vous feriez mieux de les mettre dans un script shell pour vous éviter de les écrire à plusieurs reprises.

Que se passe-t-il si boot2docker plante? Où sont stockés les fichiers Docker?

Si vous parvenez à utiliser l'argument -v et à référencer votre machine hôte, les fichiers seront en sécurité sur votre hôte.

Si vous avez utilisé «docker build -t myimage». avec un Dockerfile, vos fichiers seront intégrés à l'image.

Vos images de docker, je crois, sont stockées dans le boot2docker-vm. J'ai découvert cela lorsque mes images ont disparu lorsque je supprime la VM de VirtualBox. (Remarque, je ne sais pas comment fonctionne Virtualbox, donc les images peuvent être cachées ailleurs, tout simplement pas visibles pour Docker).

Emile
la source
5

Eu le même problème. Trouvé ceci dans la documentation de docker :

Remarque: Le répertoire hôte est, par nature, dépendant de l'hôte. Pour cette raison, vous ne pouvez pas monter un répertoire hôte à partir de Dockerfile, l'instruction VOLUME ne prend pas en charge la transmission d'un répertoire hôte, car les images construites doivent être portables. Un répertoire hôte ne serait pas disponible sur tous les hôtes potentiels.

Ainsi, le montage d'un répertoire hôte en lecture / écriture n'est possible qu'avec le -vparamètre de la docker runcommande, comme les autres réponses l'indiquent correctement.

matthaeus
la source
Qu'est-ce que le répertoire hôte exactement?
Nicolas S.Xu
@ NicolasS.Xu N'importe quel chemin sur la machine hôte Docker réelle.
J. Scott Elblein
5

Voici un exemple avec un chemin Windows:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

En guise de remarque, pendant tout ce tirage de cheveux, avoir à lutter pour comprendre et retaper des chemins encore et encore, j'ai décidé de créer un petit AutoHotkeyscript pour convertir un chemin Windows en un chemin formaté "Docker Windows " . De cette façon, tout ce que j'ai à faire est de copier tout chemin Windows que je veux utiliser comme point de montage dans le presse-papiers, d'appuyer sur la touche "Applications" du clavier, et il le formatera dans un format de chemin que Docker apprécie.

Par exemple:

Copiez ceci dans votre presse-papiers:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

appuyez sur Apps Keytandis que le curseur est là où vous le souhaitez sur la ligne de commande, et il y collera ceci:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

Économise beaucoup de temps pour moi. Le voici pour quiconque le jugera utile.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 
J. Scott Elblein
la source
4

Pour que cela fonctionne sous Windows 10, j'ai dû ouvrir la fenêtre Docker Settings dans la barre d'état système et aller dans la section Shared Drives .

J'ai ensuite coché la case à côté C. Docker m'a demandé mes informations d'identification de bureau pour obtenir l'autorisation d'écrire dans mon dossier Utilisateurs.

Ensuite, j'ai exécuté le conteneur Docker en suivant les exemples ci-dessus et également l'exemple sur cette page de paramètres, en l'attachant /datadans le conteneur.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Adam Smith
la source
3

Notez que sous Windows, vous devrez fournir le chemin absolu.

Ci-dessous a fonctionné pour moi.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash
Chankey Pathak
la source
3

j'ai eu les mêmes problèmes, j'essayais de monter le dossier C: \ Users \ sur docker
c'est ainsi que je l'ai fait en ligne de commande Docker Toolbox

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
Abhishek DK
la source
2

J'avais la même exigence pour monter le répertoire hôte depuis le conteneur et j'ai utilisé la commande de montage de volume. Mais lors des tests, nous avons remarqué que cela créait également des fichiers à l'intérieur du conteneur, mais après quelques recherches, nous avons constaté qu'il ne s'agissait que de liens symboliques et que le système de fichiers réel était utilisé par la machine hôte.

Sunil Chauraha
la source
2

Vous pouvez également le faire avec Portainer l'application Web pour une expérience visuelle différente.

Tirez d'abord l'image Portainer:

docker pull portainer/portainer

Créez ensuite un volume pour Portainer:

docker volume create portainer_data

Créez également un conteneur Portainer:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Vous pourrez accéder à l'application Web avec votre navigateur à cette URL: " http: // localhost: 9000 ". Lors de la première connexion, vous serez invité à définir vos informations d'identification d'administrateur Portainer.

Dans l'application Web, suivez ces menus et boutons: (Conteneur> Ajouter un conteneur> Paramètres de remplissage > Déployer le conteneur)

J'ai eu du mal à créer un volume de "montage" avec Portainer et j'ai réalisé que je devais cliquer sur "lier" lors de la création du volume de mon conteneur. Vous trouverez ci-dessous une illustration des paramètres de liaison de volume qui ont fonctionné pour ma création de conteneur avec un volume monté lié à l'hôte.

paramètres de liaison de volume

PS: j'utilise Docker 19.035 et Portainer 1.23.1

Michael Fayad
la source