WSL 上的 Docker 不会绑定挂载 $HOME

Seb*_*eth 5 docker windows-subsystem-for-linux

我最初在 Stack Overflow 上问过这个问题,但我认为超级用户可能更合适。

我在 WSL(Linux 的 Windows 子系统,Ubuntu 16.04)上使用 Docker 时遇到了最奇怪的情况。我试图将安装/home/username(或只是$HOME为了方便)绑定为容器中的卷,而不是在容器中查找我的主目录的内容,而是完全获得一些其他卷。

奇怪的是,每当我尝试绑定 mount$HOME/home/username. 如果我触摸一个新文件,它会出现在我安装到的所有其他容器中$HOME。所有其他绑定安装到任何其他目录都可以正常工作。

例如,这些都共享同一个神秘文件夹:

docker run -it --rm -v /home/username:/test alpine sh
docker run -it --rm -v $HOME:/test alpine sh
docker run -it --rm -v $HOME:/test -v $HOME:/test2 alpine sh
Run Code Online (Sandbox Code Playgroud)

当我执行 a 时,docker volume ls没有名为 的卷/home/username,因此排除了意外拥有同名的 docker 托管卷的情况。

我正在安装的这个神秘卷是什么,为什么 docker 没有$HOME正确安装我的目录?

nij*_*ave 1

Docker 守护进程在哪里运行?我猜它运行在某个服务器上,或者如果您使用 Docker for Windows(带有 Windows 容器/LCOW),它运行在 WSL 外部的主机上。绑定挂载可能会在主机上查找“/home/username”,不是在运行 Docker 客户端的 WSL 环境中查找。根据您对 /c 和 /d 工作的评论,听起来这些被映射回主机上的 C:\ 和 D:\ 驱动器,这表明您正在使用 Docker for Windows

从 WSL 内部来看,驱动器似乎安装在 WSL 内部,但 rootfs 位于虚拟文件系统上,这可以解释为什么 /c 和 /d 正在工作

nick@nick-desktop:/mnt$ mount
rootfs on / type lxfs (rw,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
none on /dev type tmpfs (rw,noatime,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,gid=5,mode=620)
none on /run type tmpfs (rw,nosuid,noexec,noatime,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,noatime)
none on /run/shm type tmpfs (rw,nosuid,nodev,noatime)
none on /run/user type tmpfs (rw,nosuid,nodev,noexec,noatime,mode=755)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noatime)
C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000)
W: on /mnt/w type drvfs (rw,noatime,uid=1000,gid=1000)
X: on /mnt/x type drvfs (rw,noatime,uid=1000,gid=1000)
Z: on /mnt/z type drvfs (rw,noatime,uid=1000,gid=1000)
Run Code Online (Sandbox Code Playgroud)

以下是一些讨论 WSL 中的 Linux rootfs 如何工作的文档https://blogs.msdn.microsoft.com/wsl/2016/06/15/wsl-file-system-support/

Windows WSL rootfs 中的位置在 KCU:\Software\Microsoft\Windows\CurrentVersion\Lxss 中列出(请参阅https://github.com/Microsoft/WSL/issues/2578

以下是有关 Docker 架构的一些附加信息,解释了 Docker 守护进程和客户端之间的区别https://docs.docker.com/engine/docker-overview/