2016-05-03 3 views
0

Ich möchte ein Docker-Image in meinem Arbeitsprozess verwenden. Zum Beispiel möchte ich larryprice/sass verwenden, um meine SASS-Dateien zu CSS zu kompilieren. Dieses Bild ist ziemlich einfach:Docker-Container zeigt keine Dateien auf Windows-Volumes an, wenn sich der Volume-Endpunkt nicht auf dem Laufwerk befindet C:

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

Ich bin von Windows 10, Docker 1.11 und VirtualBox 5.0.16 verwenden.

Meine Projektdateien auf der Arbeit SSD platziert, die auf logischen Laufwerk D abgebildet - D: \ Projects \ Foo \ Bar \ web \ sass

So ist mein Problem folgendes: wenn ich ein Volumen an das Anhängen Container von Laufwerk D: (durch $ PWD oder durch vollständigen Pfad in MINGW-Stil/D/Projekte/Foo/Bar/Web/Sass) z

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

der Behälter keine SASS Dateien sehen:

$ docker exec -i -t sass /bin/bash 
[email protected]:/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 .. 

Aber wenn ich ein Volumen von Systemfestplatte (C-Mount :) alles funktioniert gut:

$ 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 

Wie ich kann ich Volumes von jedem Ort aus installieren, den ich in Windows brauche? Oder was mache ich in meinem Fall falsch?

p.s. Führender Schrägstrich zum Pfad hinzufügen funktioniert auch nicht:

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

Der Docker-Host ist die virtuelle Maschine, die in Virtualbox ausgeführt wird. Wenn Sie also ein Volume mounten, wird ein Ordner innerhalb dieser VM eingehängt, kein Windows 10-Ordner. Sie müssen Ihren Weg hacken, um einen Ordner von Windows zu mounten: http://Stackoverflow.com/a/30589373/5388620. [Docker für Windows] (https://blog.docker.com/2016/03/docker-for-mac-windows-beta/) zielt darauf ab, die Volumenmontage nahtlos zu machen. – Shanoor

+0

@ShanShan dank der Antwort. Sieht so aus, als wäre dies die gleiche Lösung, die ich gerade gepostet habe. –

Antwort

1

Okay. Endlich fand ich eine Erklärung und Lösung für meine eigene Frage. Diese Lösung funktioniert sowohl für Windows als auch für MacOS X (da beide VirtualBox verwenden, um Docker die Dinge zu ermöglichen).

Die Ursache des Problems besteht aus zwei Punkten:

  1. standardmäßig VirtualBox VM hat Zugriff auf das Host-Dateisystem (proof) begrenzt. In meinem Fall hat es Zugriff auf den Benutzerordner auf Laufwerk C: über VBox freigegebenen Ordner (screen). Dank diesem kann ich Volume-Mapping wie dieses verwenden: ~/sass:/src (oder vollständiger Pfad:/c/users/dbykadorov/sass). Leider erlaubt mir diese Konfiguration keinen Pfad außerhalb von/c/users/zu verwenden.

Lösung für diesen Punkt: einen anderen freigegebenen Ordner auf dem VM hinzuzufügen, wies auf Verzeichnis ich brauche. Ich habe eine neue Freigabe d:/Projects (screen) erstellt. Starten Sie Ihre VM neu.

Ich hoffe, hier werden Sie Ihren Fall vervollständigen. Aber in meinem Fall mountet VirtualBox keinen neuen freigegebenen Ordner beim Systemstart. Also, ich habe ein zweites Problem:

  1. VirualBox nicht zusätzliche freigegebenen Ordner, die ich gerade hinzugefügt.

Zusätzliche Lösung:

Lassen Sie uns versuchen, manuell freigegebenen Ordner zu montieren. Melden Sie sich mit beliebigen verfügbaren Methoden bei der VM an. In der Konsole:

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

Okay, das macht den Trick!Jetzt kann ich jedes Projektverzeichnis (in D: \ Projects) mounten!

Aber ... wenn ich meine VM neu gestartet wird der Mount-Punkt verschwinden = (Jetzt müssen wir unsere Mount-Punkt hartnäckiger machen Wie here beschrieben.

# 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 

Wichtiger Hinweis: machen Volumes erstellen mehr Klarheit es wird eine gute Idee sein, freigegebenen Ordner auf den gleichen Pfad wie auf dem Host zu mounten, zB wenn wir Volumes von E: \ Foo \ Bar \ Baz (/ e/Foo/Bar/Baz im MINGW Stil erstellen müssen) Dann müssen wir einen neuen freigegebenen Ordner für E: \ Foo \ Bar \ Baz hinzufügen und ihn genau an/e/Foo/Bar/Baz in Ihrer Docker-VM mounten

Das ist alles.

Verwandte Themen