当卷端点不在驱动器 C 上时,Docker 容器看不到 windows 卷上的文件:

Docker container doesn't see files on windows volumes when the volume endpoint isn't on the drive C:

我想在工作过程中使用 docker 图片。例如,我想使用 larryprice/sass 将我的 SASS 文件编译为 CSS。这张图片非常简单:

FROM ruby:2.2 
RUN gem install sass 
WORKDIR /tmp 
ENTRYPOINT ["sass", "--watch", "/src"]

我正在使用 Windows 10、Docker 1.11 和 VirtualBox 5.0.16。

我的项目文件放在工作 SSD 上,映射到逻辑驱动器 D - D:\Projects\Foo\Bar\web\sass

所以,我的问题如下:当我将卷从驱动器 D 附加到容器时:(通过 $PWD 或 MINGW 样式的完整路径 /D/Projects/Foo/Bar/web/sass)例如

cd /D/Projects/Foo/Bar/web
docker run --name sass -v $PWD/sass:/src --rm larryprice/sass

容器看不到任何 SASS 个文件:

$ docker exec -i -t sass /bin/bash
root@541aabac9ceb:/tmp# ls -al /src/
total 4
drwxr-xr-x  2 root root   40 May  3 13:05 .
drwxr-xr-x 50 root root 4096 May  3 13:05 ..

但是当我从系统磁盘 (C:) 挂载卷时一切正常:

$ docker run --name sass -v ~/sass:/src --rm larryprice/sass
[Listen warning]:
  Listen will be polling for changes. Learn more at https://github.com/guard/listen#polling-fallback.
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> New template detected: ../src/test.sass
      write /src/test.css
      write /src/test.css.map

如何从 Windows 中我需要的任何地方挂载卷?或者我做错了什么?

p.s。向路径添加前导斜线也不起作用:

docker run --name sass -v //d/Projects/Foo/Bar/web/sass:/src --rm larryprice/sass

好的。最后我找到了我自己的问题的解释和解决方案。此解决方案适用于 Windows 和 MacOS X(因为它们都使用 VirtualBox 让 Docker 做这些事情)。

问题的根源有两点:

  1. 默认情况下,VirtualBox VM 对主机文件系统的访问权限有限 (proof). In my case it have access to the users folder on drive C: via VBox shared folder (screen)。多亏了这一点,我可以像这样使用卷映射:~/sass:/src(或完整路径:/c/users/dbykadorov/sass)。不幸的是,此配置不允许我使用 /c/users/.
  2. 之外的任何路径

解决方法:在虚拟机中添加另一个共享文件夹,指向我需要的目录。我创建了新共享 d:/Projects (screen)。重新启动您的虚拟机。

我希望你能在这里完成你的案子。但就我而言,VirtualBox 不会在系统启动时挂载新的共享文件夹。所以,我遇到了第二个问题:

  1. VirtualBox 没有挂载我刚刚添加的其他共享文件夹。

附加解决方案:

让我们尝试手动加载共享文件夹。通过任何可用方式登录 VM。在控制台中:

# Create mount point directory
$ mkdir -p /d/Projects
# Mount shared folder
$ mount -t vboxsf d/Projects /d/Projects

好了,到此为止!现在我可以挂载任何项目的目录(在 D:\Projects 内)!

但是...当我重新启动我的 VM 时,挂载点将消失 =( 现在我们需要使我们的挂载点更加持久。如所述 here:

# Make a file bootlocal.sh
$ touch /var/lib/boot2docker/bootlocal.sh
# Edit it
$ vi /var/lib/boot2docker/bootlocal.sh
# Add follovin lines here:
#!/bin/sh
mkdir -p /d/Projects
mount -t vboxsf d/Projects /d/Projects
# Save the file and reboot VM

重要说明:为了使创建的卷更清晰,最好将共享文件夹挂载到与主机相同的路径。例如。如果我们需要从 E:\Foo\Bar\Baz(MINGW 样式的 /e/Foo/Bar/Baz)创建卷,那么我们需要为 E:\Foo\Bar\Baz 添加新的共享文件夹并将其准确挂载到 /e/Foo/Bar/Baz在您的 Docker 虚拟机中。

这就是全部。