0

我想在我的工作过程中使用 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 中需要的任何位置挂载卷?或者在我的情况下我做错了什么?

ps 在路径中添加前导斜杠也不起作用:

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

1 回答 1

1

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

问题的根源在于两点:

  1. 默认情况下,VirtualBox VM 对主机文件系统的访问是有限的(证明)。就我而言,它可以通过 VBox 共享文件夹(screen)访问驱动器 C: 上的用户文件夹。多亏了这一点,我可以使用像这样的卷映射:~/sass:/src(或完整路径:/c/users/dbykadorov/sass)。不幸的是,这种配置不允许我使用 /c/users/ 之外的任何路径。

针对这一点的解决方案:将另一个共享文件夹添加到 VM,指向我需要的目录。我创建了新的共享 d:/Projects ( screen )。重新启动您的虚拟机。

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

  1. VirualBox 不会挂载我刚刚添加的其他共享文件夹。

附加解决方案

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

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

好的,这就是诀窍!现在我可以挂载任何项目的目录(在 D:\Projects 内)!

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

# 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 添加新的共享文件夹并准确安装它到 Docker VM 中的 /e/Foo/Bar/Baz。

就这些。

于 2016-05-04T13:24:15.870 回答