Windows 10 版本 15063.11,运行适用于 Linux 的 Windows 子系统 (WSL) Xenial 16.04.2 LTS。
WSL 中有一个运行的 docker 客户端,连接到 Windows Hyper-V 守护程序。很有趣。
我无法摆脱的一个问题是 WSL 和 Hyper-V 守护进程之间的卷路径映射 -来自撰写文件。Compose 文件应该是跨平台的——它们都是相对的,如果我开始仅仅compose.yml
为了适应我的 WSL 怪物而进行更改,服务将无法在其他任何地方正常启动,这并不完全实用。
我可以做类似的事情export MSYS_NO_PATHCONV=1
来让 WSL 在将路径发送到守护进程之前停止破坏它们吗?
这个问题需要在哪里解决?在守护进程中?在 Compose 中?在 WSL 中?我可以在哪里做出贡献?
组合文件之外的卷映射工作得很好,因为您可以在将它们传递给客户端/守护进程时绝对地指定它们,并以正确的格式指定它们。
例如,docker run -v c:/my/stuff/is/here:/vars/now/here magicImage
在 WSL 内部运行效果非常好。只是 compose 从 WSL 获取的绝对文件名实际上不是文件名,例如,/mnt/c/my/stuff/isnt/here
因为在守护进程的 Hyper-V 世界中,/mnt/c/
这是无稽之谈。
跟进:伸出了docker/compose.docker-compose
调用os.path.abspath
来解析资源的绝对路径,因此问题似乎更有可能出现在使用微软/BashOnWindows。
答案1
我认为答案已经在Docker-compose 和卷的错误绝对路径 · 问题 #1854 · Microsoft/BashOnWindowsGitHub 上的线程,但我在这里发布以供其他人查看:
有两种可能的解决方法:符号链接和绑定挂载。它们都有效,但绑定可能更好,因为某些服务不使用符号链接。
$ sudo mkdir /c
$ sudo mount --bind /mnt/c /c
$ cd /c/path/to/project
$ docker-compose ...
绑定的唯一缺点是,由于我们初始化容器的方式,它只能持续与实例(在本例中为容器)一样长的时间。因此,绑定需要成为容器启动例程的一部分。