我已经在 Windows 10 中设置了最新的 Docker Desktop 2.1.0.5,并且可以创建和运行简单/简单的容器,即docker run --rm -v c:/Users:/data alpine ls /data
运行正常。
但是,我在以下方面遇到了麻烦:(1) 创建与 Windows 主机上的文件夹绑定的卷并要求 Linux 容器使用它;(2) 为该容器指定 DockerFile。以下是我尝试的方法:
- 我通过命令创建了一个卷
docker volume create --driver local --opt type=none --opt device=c:\path\to\folder --opt o=bind test_vol
,并尝试像这样挂载它:docker run --rm -v test_vol:/data alpine ls /data
。这给了我错误:
C:\Program Files\Docker\Docker\Resources\bin\docker.exe:守护进程的错误响应:挂载卷“/var/lib/docker/volumes/test_vol/_data”时出错:无法挂载本地卷:mount c:\path\to\folder:/var/lib/docker/volumes/test_vol/_data,标志:0x1000:没有此文件或目录。
但是,如果我在命令中指定该主机文件夹docker run
而不经过以前创建的卷(像这样:),docker run --rm -v c:\path\to\folder:/data alpine ls /data
那么它可以正常工作。
- 指定 DockerFile 也有问题。如果我使用此命令:
docker run --rm --env-file c:\path\to\DockerFile -v c:\path\to\folder:/data alpine ls /data
,我会收到此错误:
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: 读取 c:\path\to\DockerFile: 句柄无效。请参阅“C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help”。
- 对于上述情况,我尝试改变斜线的方向(
/
vs\
)并将路径放在引号中,但这些都无济于事,也没有改变错误输出。 - 我确保“共享驱动器”在 Docker 桌面设置中已打开。
我对如何在 Windows 版 Docker 中指定这些路径感到很困惑。有人能建议如何解决这个问题吗?谢谢。
答案1
结论
你应该使用/host_mnt/c/path/to/folder
路径格式(注意小写驱动器号)。
深入了解
根据 Windows 版 Docker Desktop 的版本,我确定了以下路径格式:
因此,使用C:\path\to\folder
应该适用于最新的 2.3.0.2 / 2.3.0.3 版本。如果您仍在使用 2.1.0.5 版本,则//C/path/to/folder
应该可以工作。
如果您在检查创建的卷时查看路径(在 v2.3.0.3 中):
唯一保持不变的路径格式是/host_mnt/c/path/to/folder
。
这意味着,在 docker-compose 中,如果您使用任何其他格式并尝试重用已创建的卷(即连续两个),则会收到错误:
$ docker-compose up
ERROR: Configuration for volume test_vol specifies "device" driver_opt /C/path/to/folder, but a volume with the same name uses a different "device" driver_opt (/host_mnt/c/path/to/folder). If you wish to use the new configuration, please remove the existing volume "test_test_vol" first:
$ docker volume rm test_test_vol
结论
所以兼容所有版本并在 Docker Compose 中拥有令人满意的工作流程,最好的选择是使用/host_mnt/c/path/to/folder
(注意小写驱动器号):
docker volume create --driver local --opt type=none --opt device=/host_mnt/c/path/to/folder --opt o=bind test_vol
docker run --rm -v test_vol:/data alpine ls /data
对于 docker-compose 来说也是如此:
version: '3.4'
volumes:
test_vol:
driver: local
driver_opts:
type: none
device: /host_mnt/c/path/to/folder
o: bind