我在Windows 10上通过WSL2使用Docker。我只想能够创建Linux容器,并将容器中的目录映射到WSL目录。
我确信WSL必须已经可以访问Linux文件系统才能创建所使用的任何容器卷,所以如果我想绑定装载一个目录,我可以使用该文件系统而不必安装和托管整个单独的Linux发行版吗?
我已经在\wsl$\Docker桌面上找到了Docker使用的文件系统,并尝试在其中绑定挂载目录,但未能成功。
有人知道如何让它发挥作用吗?或者为什么不知道?
UPDATE这是我在WSL文件系统中创建一个文件并将其绑定到Docker容器中的一个会话。所有命令都完成了,没有错误,但它就是不起作用,在容器内没有检测到绑定装载的更改。
:: Verify existing distros and default distro
C:UsersUser>wsl -l
Windows Subsystem for Linux Distributions:
docker-desktop (Default)
docker-desktop-data
:: Start wsl
C:UsersUser>wsl
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/c/Users/User#
:: View filesystem mounts
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/c/Users/User# cd ../../../
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host# ls
c wsl
:: Create a directory in the WSL filesystem to bind mount into a docker image
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host# mkdir wsl/test-dir1
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host# ls wsl
docker-desktop docker-desktop-data test-dir1
:: In a Windows CMD shell spin up a docker container with a bind mount to the created directory
C:Home>docker run --rm -it --entrypoint bash -v //wsl$/test-dir1:/myapp node
root@3a56694db873:/#
:: In the container verify the bind mount is present - 'myapp' is there
root@3a56694db873:/# ls
bin dev home lib64 mnt opt root sbin sys usr
boot etc lib media myapp proc run srv tmp var
:: Back in the WSL Bash prompt (NOT in the container) create a file in the supposedly mounted directory.
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/wsl/test-dir1# echo Hi!! > test1.txt
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/wsl/test-dir1# ls
test1.txt
:: In the interactive shell attached to the container verify that the created file is visible.
root@3a56694db873:/# ls myapp
root@3a56694db873:/# <-- test1.txt should be here!!!
在容器中看不到创建的文件。绑定装载不工作。
由于几个原因,这不会起作用。
将Linux文件系统中的目录绑定到Docker容器的目的是,在Windows上,这比在Windows文件系统上绑定安装目录提供了更好的IO性能和工作文件更新通知。
但是,为了使绑定装载工作,必须从Linux发行版中调用docker run
命令,以便绑定装载路径是该发行版中的有效Linux路径。
docker桌面发行版不能做到这一点有两个原因。
-
使Windows命令能够在Linux发行版的文件系统中运行的标准WSL命令互操作在docker桌面发行版上不起作用,因为它是一个特殊的发行版,仅用于作为docker实现的一部分。因此,像
cmd.exe /C dir
这样在标准WSL Linux发行版中运行良好的命令在docker桌面发行版中不起作用。因此,由于同样的原因,Windows docker.exe也无法在docker桌面发行版中运行。 -
Docker Desktop有一个集成设置,可以启用该设置来为指定的WSL Linux发行版添加Docker支持,当启用该设置时,它将使
docker
命令能够在该发行版中执行。然而Docker Desktop在其自己的发行版上没有启用此选项,也没有办法启用它
因此,您必须安装一个额外的Linux发行版,并从中绑定装载容器目录。