簡體   English   中英

當卷端點不在驅動器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中需要的任何位置掛載卷? 還是我做錯了什么?

ps在路徑中添加前導斜杠也不起作用:

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

好的。 最后,我為自己的問題找到了解釋和解決方案。 該解決方案適用於Windows和MacOS X(因為它們都使用VirtualBox來使Docker做事)。

問題的根源包括兩點:

  1. 默認情況下,VirtualBox VM具有對主機文件系統的有限訪問權限( 證明 )。 就我而言,它可以通過VBox共享文件夾( 屏幕 )訪問驅動器C:上的用戶文件夾。 多虧了這一點,我可以使用像這樣的卷映射:〜/ sass:/ src(或完整路徑:/ c / users / dbykadorov / sass)。 不幸的是,此配置不允許我使用/ c / users /之外的任何路徑。

這時的解決方案 :將另一個共享文件夾添加到VM,指向我需要的目錄。 我創建了新的共享d:/ Projects( 屏幕 )。 重新啟動您的VM。

希望您能結案。 但就我而言,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。

就這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM