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:
- Comment dois-je lier le dossier principal au dossier test_container présent à l'intérieur du conteneur Docker?
- Je dois le faire automatiquement. Comment faire cela sans vraiment utiliser le
run -d -v
commande? - Que se passe-t-il si le boot2docker plante? Où sont stockés les fichiers Docker (à l'exception de Dockerfile)?
docker
mount
boot2docker
Kishore Vaishnav
la source
la source
Réponses:
Vous pouvez procéder de plusieurs manières. La façon la plus simple de le faire est d'utiliser la
ADD
commande dockerfile comme ceci: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
.tar
et 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'
-v
indicateur lorsque vous utilisez Docker Run comme ceci:la source
ADD
n'est en fait pas "monté", il copie le fichier dans le conteneur en le conservant à l'intérieur.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
mount
place 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-v
or--volume
, mais l'ordre des clés n'est pas significatif et la valeur de l'indicateur est plus facile à comprendre.Le
type
de la montagne, qui peut êtrebind
,volume
outmpfs
.(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é commesource
ousrc
.Le
destination
prend comme valeur le chemin où le fichier ou le répertoire sera monté dans le conteneur. Peut être spécifié commedestination
,dst
outarget
.Donc, pour monter le répertoire courant (source) avec
/test_container
(cible), nous allons utiliser: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:Vous devrez également gérer l'autorisation de fichier, consultez cet article .
la source
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:
1) Montez le système local sur
boot2docker
2) Montez le
boot2docker
fichier sur le conteneur LinuxEnsuite, lorsque vous
ls
à l'intérieur du,containerfolder
vous verrez le contenu de votrehostfolder
.la source
net share
commande 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.mount: unknown filesystem type 'vboxsf'
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.
la source
docker run -t -i -v /tmp:/tmp ubuntu /bin/bash
où l'hôte/tmp
sera monté sur le conteneur/tmp
. Maintenant, on peut àtouch /tmp/hello-world
partir du conteneur et voir le fichier apparaître sur l'hôte.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/host
est mappé à partir de l'boot2docker
image 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).
la source
[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
/private
pré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:
Partagez maintenant le dossier sur VirtualBox:
Enfin, réinstallez ssh dans la station d'accueil et montez le dossier que nous venons de partager:
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.
la source
docker-machine
doc.-v
drapeau?-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é-v
pointe 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./Users
pour ê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/development
ou quoi que/Users
ce soit d'autre que vous allez avoir des problèmes docs.docker.com/engine/userguide/containers/dockervolumesJ'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:
la source
Dans mon système, j'ai corrigé la réponse de nhjk, cela fonctionne parfaitement lorsque vous ajoutez le
-t
drapeau.la source
Si l'hôte est Windows 10, au lieu d'une barre oblique, utilisez une barre oblique inverse -
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.
la source
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
la source
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/container
directement depuis votre invite Mac, sans double montagela source
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:Ensuite, pour le tester, vous pouvez le faire à l'
echo TEST > hostTest.txt
intérieur de votre image. Vous devriez pouvoir voir ce nouveau fichier dans le dossier hôte local à l'adresseC:/Users/C/Desktop/dockerStorage/
.la source
-v $(pwd):/var/xx
premier et cela a fonctionné, mais a abouti à un répertoire vide. Je lance cyg via babun.J'ai eu le même problème. Ma ligne de commande ressemblait à ceci:
Le problème était avec 'pwd'. J'ai donc changé cela en $ (pwd):
la source
z
?À partir de Docker 18-CE, vous pouvez utiliser
docker run -v /src/path:/container/path
pour 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}:/projectpath
et 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.
la source
/c/projectpath
mais j'obtiens l'erreurbind mount source path does not exist: /host_mnt/c/projectpath
.Je trouve que tout répertoire portant application de la directive du système comme
/var
,/usr
,/etc
ne pouvait pas être monter sous le conteneur.La directive doit se trouver sur le
-v
commutateur d' espace de l'utilisateur et indique au démon docker de monter le répertoire local sur le conteneur, par exemple:la source
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
la source
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.
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).
la source
Eu le même problème. Trouvé ceci dans la documentation de docker :
Ainsi, le montage d'un répertoire hôte en lecture / écriture n'est possible qu'avec le
-v
paramètre de ladocker run
commande, comme les autres réponses l'indiquent correctement.la source
Voici un exemple avec un chemin Windows:
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
AutoHotkey
script 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 Key
tandis 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.
la source
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
/data
dans le conteneur.la source
Notez que sous Windows, vous devrez fournir le chemin absolu.
Ci-dessous a fonctionné pour moi.
la source
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
la source
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.
la source
Vous pouvez également le faire avec Portainer l'application Web pour une expérience visuelle différente.
Tirez d'abord l'image Portainer:
Créez ensuite un volume pour Portainer:
Créez également un conteneur 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.
PS: j'utilise Docker 19.035 et Portainer 1.23.1
la source