如何在使用Windows主机时装载Docker卷?

在windows主机下安装一个docker卷对我来说是一个巨大的痛苦,我无法完成它的工作。

目前我得到了以下简单的Dockerfile:

FROM php:5-apache RUN apt-get update 

当我从它build立一个图像,并启动一个容器

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

容器启动正常。

但是,当我试图装入一个卷:

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

将显示以下消息:

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

/var/www目录定义在容器中,尝试其他directorys不会改变结果。 在主机端目录前面加一个斜杠也没有帮助。 ( //c/Users/phisch/dev/htdocs

如何安装例如/var/wwwC:/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 } } ] 

事实certificate,容器端目录/var/www需要是空的,因为它有一个子目录www ,docker无法将它用作安装点。

CMD Windows shell有可能将其解释为一个选项。

先尝试一下docker-machine ssh default,以便在虚拟机中打开一个ssh会话。 那里再次尝试docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev

正如议会18290 号所指出的那样 :

你可以考虑使用docker-compose ; docker-compose允许您定义相对于docker-compose.yml文件位置的绑定安装卷。
使用docker-compose文件,您可以指定在单个文件中运行容器所需的所有选项,这使得它成为团队成员之间共享的理想选择(即,只需运行docker-compose up -d将启动项目的所有容器正确的选项)。

这个评论提到第二个/:

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

即使在码头工具箱的msys shell会话中,也有问题(如问题282 )


经过漫长的讨论,问题是/var/www有一个文件夹。

挂载/c/Users/phisch/dev/htdoc到一个空文件夹可以工作,但可能不会给出预期的结果,因为默认的CMD apache2-foreground可能仍然会基于/var/www提供其内容(不会有htdocs内容如果该htdocs被挂载到另一个文件夹)。

如果我们在窗口上谈论docker,那么我们必须考虑到所有容器都在Virtual Box(VB)上运行的事实。 在将音量安装到容器之前,我们必须确保特定的文件夹可用于VB。

首先定义当前运行的码头机的名称,运行

 $ docker-machine.exe active default 

其次,将共享文件夹添加到VB

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

第三,创建文件夹

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

第四,挂载它

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

最后,创建容器

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

我在PowerShell中使用Docker for Windows,并使用$PWD在装入卷时引用当前目录,对我来说效果很好。 几个例子:

 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