【问题标题】:Why is /host_mt/ required when using bind mount volumes in Windows为什么在 Windows 中使用绑定挂载卷时需要 /host_mt/
【发布时间】:2020-02-16 18:13:38
【问题描述】:

我有以下情况:我想创建一个绑定挂载,它根据 docker 映像的内容进行初始化。

在 MacOS 上,我可以执行以下操作来完成此操作:

  1. 创建卷:docker volume create --opt type=none --opt device=%(pwd)/data_dir --opt o=bind --name data_volume
  2. 使用卷运行容器:docker run -v data_volume:/home

这将创建一个与当前工作目录中的目录数据绑定挂载的卷,该卷称为 data_volume。运行卷只需要指定卷的名称。

但是,在 Windows 10 上,我可以执行以下操作:docker run -v %cd%/data_dir:/home。这等效于 MacOS 描述,但不使用卷(因此它使用空的 data_dir 目录进行初始化)。然而,这表明 Docker 理解当前的绑定挂载。

当我使用为 MacOS 描述的步骤创建卷时,我收到以下错误:

来自守护进程的错误响应:无法挂载本地卷:mount c:/some-path/data_dir:/var/lib/docker/volumes/data_volume/_data,标志:0x1000:没有这样的文件或目录。

检查不使用 docker 卷使用的容器会产生以下设置:

...
"Mounts": [
   {
      "Type": "bind",
      "Source": "/host_mnt/c/some-path/data_dir",
      "Destination": "/home,
      "Mode": "",
      "RW": true,
      "Propagation": "rprivate"
   }
],
...

因此,如果我将音量更改为:docker volume create --driver local -o o=bind -o type=none -o device=/host_mnt/c/some-path/data_dir data_volume

它有效。为什么在 Windows 上创建卷时需要 /host_mnt/ 前缀,但在运行容器和直接挂载绑定时不需要(没有 docker 卷)。

【问题讨论】:

    标签: docker docker-volume


    【解决方案1】:

    由于其内核命名空间,Docker 仅适用于 linux。因此,当您在 Windows 计算机上运行 docker 容器时,它实际上运行的是运行该 docker 容器的 linux 虚拟机(因此需要 Hyper-V 来运行 docker)。 linux 和 mac 使用的 UNIX 文件路径与 windows 使用的不同。在 linux 和 mac 上,文件路径从 / 开始,而在 Windows 上,文件路径从驱动器开始(如 C:/)。两个不同的系统互不兼容,为了让系统互相兼容,docker把C盘放在/host_mnt/c

    【讨论】:

    • 感谢您富有洞察力的评论。我觉得奇怪的是没有找到关于这个(或它产生的问题)的文档。
    • @Emptyless 很高兴能帮到你!
    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 2019-04-13
    • 2021-09-02
    • 2017-07-05
    • 2021-05-08
    • 2014-05-24
    • 2018-09-24
    • 2019-01-09
    相关资源
    最近更新 更多