【问题标题】:Docker container doesn't see files on windows volumes when the volume endpoint isn't on the drive C:当卷端点不在驱动器 C 上时,Docker 容器看不到 Windows 卷上的文件:
【发布时间】:2016-08-28 14:54:24
【问题描述】:

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

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

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

【问题讨论】:

  • Docker 主机是在 Virtualbox 中运行的 VM,因此当您挂载卷时,它会在该 VM 中挂载一个文件夹,而不是 Windows 10 文件夹。您必须破解从 Windows 挂载文件夹的方法:stackoverflow.com/a/30589373/5388620Docker for Windows 旨在使卷安装无缝。
  • @ShanShan 感谢您的回答。看起来这与我刚刚发布的解决方案相同。

标签: docker sass docker-volume


【解决方案1】:

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

问题的根源在于两点:

  1. 默认情况下,VirtualBox VM 对主机文件系统 (proof) 的访问权限有限。在我的情况下,它可以访问驱动器 C 上的用户文件夹:通过 VBox 共享文件夹 (screen)。多亏了这一点,我可以使用像这样的卷映射:~/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 内)!

但是...当我重新启动我的虚拟机时,挂载点将消失 =( 现在我们需要使挂载点更加持久。如 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 虚拟机中。

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2017-02-21
    • 2016-02-08
    • 2023-03-15
    相关资源
    最近更新 更多