Docker:Windows 10 版 Docker 中 Linux 容器卷出现“未找到”和“无效句柄”错误

Docker:Windows 10 版 Docker 中 Linux 容器卷出现“未找到”和“无效句柄”错误

我已经在 Windows 10 中设置了最新的 Docker Desktop 2.1.0.5,并且可以创建和运行简单/简单的容器,即docker run --rm -v c:/Users:/data alpine ls /data运行正常。

但是,我在以下方面遇到了麻烦:(1) 创建与 Windows 主机上的文件夹绑定的卷并要求 Linux 容器使用它;(2) 为该容器指定 DockerFile。以下是我尝试的方法:

  1. 我通过命令创建了一个卷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那么它可以正常工作。

  1. 指定 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”。

  1. 对于上述情况,我尝试改变斜线的方向(/vs \)并将路径放在引号中,但这些都无济于事,也没有改变错误输出。
  2. 我确保“共享驱动器”在 Docker 桌面设置中已打开。

我对如何在 Windows 版 Docker 中指定这些路径感到很困惑。有人能建议如何解决这个问题吗?谢谢。

答案1

结论

你应该使用/host_mnt/c/path/to/folder路径格式(注意小写驱动器号)。


深入了解

根据 Windows 版 Docker Desktop 的版本,我确定了以下路径格式:

跨 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

相关内容