为什么在 Windows 中使用绑定挂载卷时需要 /host_mt/
Why is /host_mt/ required when using bind mount volumes in Windows
我遇到以下情况:我想创建一个绑定安装,它根据 docker 图像的内容进行初始化。
在 MacOS 上,我可以执行以下操作来完成此操作:
- 创建卷:
docker volume create --opt type=none --opt device=%(pwd)/data_dir --opt o=bind --name data_volume
- 使用卷运行容器:
docker run -v data_volume:/home
这将创建一个绑定挂载到当前工作目录中目录数据的卷,该卷名为 data_volume。 运行 卷只需要指定卷的名称。
但是,在 Windows 10 上,我可以执行以下操作:docker run -v %cd%/data_dir:/home
。这等同于 MacOS 描述但不使用卷(因此它使用空 data_dir
目录初始化)。然而,这表明 Docker 理解当前的绑定安装。
当我使用针对 MacOS 描述的步骤创建卷时,出现以下错误:
Error response from daemon: failed to mount local volume: mount c:/some-path/data_dir:/var/lib/docker/volumes/data_volume/_data, flags: 0x1000: no such file or directory.
检查不使用 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 仅针对 linux 构建,因为其内核命名空间。因此,当您在 windows 计算机上 运行 一个 docker 容器时,它实际上 运行 是一个 linux 虚拟 machine 运行 是 docker 容器(因此 运行 docker 需要 Hyper-V)。 linux 和 mac 使用的 UNIX 文件路径与 windows 使用的不同。在 linux 和 mac 上,文件路径从 /
开始,而在 windows 上,文件路径从驱动器开始(如 C:/
)。两个不同的系统互不兼容,所以docker把C盘放在/host_mnt/c
,让系统互相兼容。
我遇到以下情况:我想创建一个绑定安装,它根据 docker 图像的内容进行初始化。
在 MacOS 上,我可以执行以下操作来完成此操作:
- 创建卷:
docker volume create --opt type=none --opt device=%(pwd)/data_dir --opt o=bind --name data_volume
- 使用卷运行容器:
docker run -v data_volume:/home
这将创建一个绑定挂载到当前工作目录中目录数据的卷,该卷名为 data_volume。 运行 卷只需要指定卷的名称。
但是,在 Windows 10 上,我可以执行以下操作:docker run -v %cd%/data_dir:/home
。这等同于 MacOS 描述但不使用卷(因此它使用空 data_dir
目录初始化)。然而,这表明 Docker 理解当前的绑定安装。
当我使用针对 MacOS 描述的步骤创建卷时,出现以下错误:
Error response from daemon: failed to mount local volume: mount c:/some-path/data_dir:/var/lib/docker/volumes/data_volume/_data, flags: 0x1000: no such file or directory.
检查不使用 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 仅针对 linux 构建,因为其内核命名空间。因此,当您在 windows 计算机上 运行 一个 docker 容器时,它实际上 运行 是一个 linux 虚拟 machine 运行 是 docker 容器(因此 运行 docker 需要 Hyper-V)。 linux 和 mac 使用的 UNIX 文件路径与 windows 使用的不同。在 linux 和 mac 上,文件路径从 /
开始,而在 windows 上,文件路径从驱动器开始(如 C:/
)。两个不同的系统互不兼容,所以docker把C盘放在/host_mnt/c
,让系统互相兼容。