在WSL(适用于Linux的Windows子系统,Ubuntu 16.04)上使用Docker的情况最奇怪。我正在尝试将挂载/home/username
(为方便起见,仅绑定$HOME
)作为容器中的卷,而不是在容器中找到我的主目录的内容,而是完全获得了其他一些卷
奇怪的是,每当我尝试绑定装载$HOME
或/home/username
时,这个“其他卷”都会从一个容器持续存在。如果我touch
一个新文件,它会出现在我将$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
当我执行docker volume ls
时,没有名为/home/username
的卷,因此可以排除意外地有一个由Docker托管的同名卷的情况。
我要装入的这个神秘卷是什么?为什么docker无法正确装入我的$HOME
目录?
答案 0 :(得分:0)
我按照https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly#ensure-volume-mounts-work中的说明进行了设置。
然后,我必须明确地export HOME=/c/Users/rfay
,以便Windows上的Docker守护程序可以访问它。但这行得通。基本的魔术在于,您在WSL中的路径必须是Docker守护进程可以在本机Windows中转换的东西。
答案 1 :(得分:0)
无需按照@rfay的建议更改堆垛点。相反,如果您使用一个小的命令foo,则可以使用pwd和sed为您修复该值。
docker run -it -v $(pwd | sed 's/^\/mnt//'):/var/myfolder -w "/var/myfolder" centos:7
pwd将返回当前的工作文件夹,通常格式为'/ mnt / c / code / myfolder'。将其输液到sed并不加任何替换'/ mnt'将使您留下诸如'/ c / code / myfolder'之类的路径,这是Windows docker所需的路径。您需要将整个内容包装在$()中,以使其在适当位置执行。
我发现这真的很好。