Comment monter un volume Docker en utilisant un hôte Windows?

Monter un volume Docker sous un hôte Windows a été très pénible pour moi et je ne pouvais pas le faire fonctionner.

Actuellement, j’ai le fichier Dockerfile suivant:

FROM php:5-apache RUN apt-get update 

Lorsque je construis une image à partir de celle-ci et démarre un conteneur

 docker build -t phisch:dev . docker run phisch:dev 

le conteneur démarre correctement.

Mais quand j’essaye de monter un volume,

 docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev 

le message suivant sera affiché:

 C:\Users\phisch\dev>docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev no such file or directory docker: Error response from daemon: Container command not found or does not exist.. 

Le répertoire /var/www existe bien dans le conteneur, et essayer d’autres répertoires ne modifie pas le résultat. L’ajout d’une barre oblique au dossier côté hôte ne facilite pas non plus la tâche. ( //c/Users/phisch/dev/htdocs )

Comment puis-je monter par exemple /var/www sur C:/Users/phisch/dev/htdocs ?

 phisch@DESKTOP-UC1LB9J MINGW64 ~/dev (master) $ docker inspect phisch:dev [ { "Id": "sha256:73c1533222a905a378f12505ccbd9e9b34cde5a4b34ed008c39e23d5d58a9c91", "RepoTags": [ "dev_web:latest", "phisch:dev", "phisch:dev3" ], "RepoDigests": [], "Parent": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10", "Comment": "", "Created": "2016-02-10T12:16:37.667236134Z", "Container": "dad811f51ef3b94d9845d13a0e43ad07ccd5684ea2747b3846accdc71abeb628", "ContainerConfig": { "Hostname": "e06f5a03fe1f", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "PHP_INI_DIR=/usr/local/etc/php", "PHP_EXTRA_BUILD_DEPS=apache2-dev", "PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2", "GPG_KEYS=0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3", "PHP_VERSION=5.6.18", "PHP_FILENAME=php-5.6.18.tar.xz", "PHP_SHA256=54dd9106c3469bc7028644d72ac140af00655420bbaaf4a742a64e9ed02ec1b0" ], "Cmd": [ "/bin/sh", "-c", "apt-get update" ], "ArgsEscaped": true, "Image": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10", "Volumes": null, "WorkingDir": "/var/www/html", "Entrypoint": null, "OnBuild": [], "Labels": {} }, "DockerVersion": "1.10.0", "Author": "", "Config": { "Hostname": "e06f5a03fe1f", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "PHP_INI_DIR=/usr/local/etc/php", "PHP_EXTRA_BUILD_DEPS=apache2-dev", "PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2", "GPG_KEYS=0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3", "PHP_VERSION=5.6.18", "PHP_FILENAME=php-5.6.18.tar.xz", "PHP_SHA256=54dd9106c3469bc7028644d72ac140af00655420bbaaf4a742a64e9ed02ec1b0" ], "Cmd": [ "apache2-foreground" ], "ArgsEscaped": true, "Image": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10", "Volumes": null, "WorkingDir": "/var/www/html", "Entrypoint": null, "OnBuild": [], "Labels": {} }, "Architecture": "amd64", "Os": "linux", "Size": 491287784, "VirtualSize": 491287784, "GraphDriver": { "Name": "aufs", "Data": null } } ] 

Il s’avère que le répertoire côté conteneur /var/www doit être vide, car il possède un sous-répertoire www . Docker n’a pas pu l’utiliser comme sharepoint assembly.

Il est possible que le / soit interprété comme une option par le shell Windows CMD.

Essayez d’abord un docker-machine ssh par défaut, afin d’ouvrir une session ssh sur votre machine virtuelle. À partir de là, relancez le docker: docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev

Comme commenté par thaJeztah dans le numéro 18290 :

Vous pourriez envisager d’utiliser docker-compose ; docker-compose vous permet de définir des volumes liés à la liaison par rapport à l’emplacement du fichier docker-compose.yml .
L’utilisation d’un fichier docker-compose vous permet de spécifier toutes les options nécessaires pour exécuter vos conteneurs dans un seul fichier, ce qui le rend idéal pour le partage entre membres de l’équipe (par exemple, exécutez docker-compose up -d démarrera tous les conteneurs du projet avec les bonnes options).

Ce commentaire mentionne une & dding une seconde /:

 docker run -v //c/Users/phisch/dev/htdocs:`/var/www` phisch:dev 

Même dans la session shell docker toolbox, il y a des problèmes (comme le problème 282 )


Après de longues discussions, le problème était que /var/www un dossier.

Le assembly de /c/Users/phisch/dev/htdoc sur un dossier vide fonctionne, mais peut ne pas donner le résultat escompté, car l’ apache2-foreground par défaut de CMD peut toujours servir son contenu basé sur /var/www (qui n’aurait pas de htdocs contenu si ce htdocs est monté sur un autre dossier).

Si nous parlons de Docker sous Windows, nous devons tenir compte du fait que tous les conteneurs sont exécutés sur VirtualBox.

Avant de monter du volume sur un conteneur, nous devons nous assurer que ce dossier est disponible pour VirtualBox.

Tout d’abord, pour définir le nom de la machine Docker en cours d’exécution, exécutez

 $ docker-machine.exe active default 

Deuxièmement, ajoutez le dossier partagé à VirtualBox:

 $ VBoxManage sharedfolder add default --name "some_project" --hostpath D:\Projects\some_project 

Troisièmement, créez le dossier

 $ docker-machine.exe ssh default 'sudo mkdir --parents /d/projects/some_project' 

Quasortingèmement, montez-le:

 $ docker-machine.exe ssh default 'sudo mount -t vboxsf some_project /d/projects/some_project' 

Enfin, créez un conteneur:

 $ docker run -v //d/projects/some_project://d/projects/some_project -d some-image_name 

J’utilise Docker pour Windows avec PowerShell et utilise $PWD pour faire référence au répertoire en cours lors du assembly d’un volume, et cela fonctionne bien pour moi. Quelques exemples:

 docker run -p 2368:2368 -v $PWD/ghost:/var/lib/ghost -d ghost docker run -p 2368:2368 -v $PWD/:/var/lib/ghost -d ghost