如何在使用 Windows 主机时装载 Docker 卷?
How do I mount a Docker volume while using a Windows host?
在 Windows 主机下安装 Docker 卷对我来说是一个巨大的痛苦,我无法让它工作。
目前我得到以下简单的Docker文件:
FROM php:5-apache
RUN apt-get update
当我从中构建镜像并启动容器时
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
目录,尝试其他目录也不会改变结果。在主机端目录前添加尾部斜杠也无济于事。 (//c/Users/phisch/dev/htdocs
)
如何将 /var/www
挂载到 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
}
}
]
原来容器端目录 /var/www
需要为空,因为它有一个子目录 www
。 Docker 无法将其用作挂载点。
可能 /
被 CMD Windows 解释为一个选项 shell。
首先尝试 docker-machine ssh default,以便在您的 VM 中打开 ssh 会话。从 那里 再次尝试 docker 运行:docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev
正如 thaJeztah in issue 18290 评论的那样:
You could consider using docker-compose; docker-compose allows you to define bind-mounted volumes relative to the location of the docker-compose.yml
file.
Using a docker-compose
file allows you to specify all options needed to run your containers in a single file, which makes it ideal for sharing between team members (ie, just run docker-compose up -d
will start all containers for the project with the right options).
This comment 提到加一秒/:
docker run -v //c/Users/phisch/dev/htdocs:`/var/www` phisch:dev
即使在 docker 工具箱 msys shell 会话中,也存在问题(如 issue 282)
Pyetro notes in :
In Windows, a double slash is needed at the beginning of the path to indicate the working directory.
Just to work with short path use like this:
docker run -v //$(PWD)/folder:/folder ...
经过长时间的讨论,问题是 /var/www
中有一个文件夹。
挂载 /c/Users/phisch/dev/htdoc
到一个空文件夹确实有效,但可能不会给出预期的结果,因为默认的 CMD apache2-foreground
可能仍会根据 /var/www
提供其内容(这会如果 htdocs
挂载到另一个文件夹,则没有 htdocs
内容。
如果我们在 Windows 上谈论 Docker,那么我们必须考虑到所有容器在 VirtualBox 上都是 运行。
在将卷安装到容器之前,我们必须确保特定文件夹可用于 VirtualBox。
首先定义当前运行ningDocker机器的名称,运行
$ docker-machine.exe active
default
其次,将共享文件夹添加到VirtualBox:
$ 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 用于 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
首先,请确保您从 powershell 运行 作为管理员。
接下来,运行 命令如下:
docker run --name=ken -p 8080:80 -v //c/users/Ken/Desktop/docker:/usr/share/nginx/html:ro -d nginx
测试 Windows 11.
在 Windows 主机下安装 Docker 卷对我来说是一个巨大的痛苦,我无法让它工作。
目前我得到以下简单的Docker文件:
FROM php:5-apache
RUN apt-get update
当我从中构建镜像并启动容器时
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
目录,尝试其他目录也不会改变结果。在主机端目录前添加尾部斜杠也无济于事。 (//c/Users/phisch/dev/htdocs
)
如何将 /var/www
挂载到 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
}
}
]
原来容器端目录 /var/www
需要为空,因为它有一个子目录 www
。 Docker 无法将其用作挂载点。
可能 /
被 CMD Windows 解释为一个选项 shell。
首先尝试 docker-machine ssh default,以便在您的 VM 中打开 ssh 会话。从 那里 再次尝试 docker 运行:docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev
正如 thaJeztah in issue 18290 评论的那样:
You could consider using docker-compose; docker-compose allows you to define bind-mounted volumes relative to the location of the
docker-compose.yml
file.
Using adocker-compose
file allows you to specify all options needed to run your containers in a single file, which makes it ideal for sharing between team members (ie, just rundocker-compose up -d
will start all containers for the project with the right options).
This comment 提到加一秒/:
docker run -v //c/Users/phisch/dev/htdocs:`/var/www` phisch:dev
即使在 docker 工具箱 msys shell 会话中,也存在问题(如 issue 282)
Pyetro notes in
In Windows, a double slash is needed at the beginning of the path to indicate the working directory.
Just to work with short path use like this:docker run -v //$(PWD)/folder:/folder ...
经过长时间的讨论,问题是 /var/www
中有一个文件夹。
挂载 /c/Users/phisch/dev/htdoc
到一个空文件夹确实有效,但可能不会给出预期的结果,因为默认的 CMD apache2-foreground
可能仍会根据 /var/www
提供其内容(这会如果 htdocs
挂载到另一个文件夹,则没有 htdocs
内容。
如果我们在 Windows 上谈论 Docker,那么我们必须考虑到所有容器在 VirtualBox 上都是 运行。
在将卷安装到容器之前,我们必须确保特定文件夹可用于 VirtualBox。
首先定义当前运行ningDocker机器的名称,运行
$ docker-machine.exe active
default
其次,将共享文件夹添加到VirtualBox:
$ 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 用于 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
首先,请确保您从 powershell 运行 作为管理员。
接下来,运行 命令如下:
docker run --name=ken -p 8080:80 -v //c/users/Ken/Desktop/docker:/usr/share/nginx/html:ro -d nginx
测试 Windows 11.