webentwicklung-frage-antwort-db.com.de

Ein einzelnes Dateivolume, das in Docker als Verzeichnis angehängt wurde

Docker-Dokumentation sagt, dass es möglich ist, eine einzelne Datei in einen Docker-Container einzuhängen:

Das Flag -v kann auch verwendet werden, um eine einzelne Datei anstelle von nur Verzeichnissen vom Host-Computer bereitzustellen.

$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

Auf diese Weise werden Sie in eine Bash-Shell in einem neuen Container verschoben. Der Bash-Verlauf wird auf dem Host gespeichert. Wenn Sie den Container verlassen, wird der Verlauf der im Container eingegebenen Befehle auf dem Host gespeichert.

Wenn ich das aber versuche, wird die Datei als Verzeichnis gemountet:

[email protected] ~/project $ docker run --rm -it -v file.json:/file.json test
total 80K
drwxr-xr-x  9 root root 4.0K Dec  7 12:58 .
drwxr-xr-x 63 root root 4.0K Dec  7 12:58 ..
drwxr-xr-x  2 root root 4.0K Dec  4 16:10 file.json

Mein Dockerfile sieht so aus:

FROM ubuntu:14.04
MAINTAINER Tom
CMD ["ls", "-lah", "/test"]

Docker-Version ist 1.9.1, Build a34a1d5.

Handelt es sich um ein Dokumentationsproblem, ein Missverständnis auf meiner Seite, oder ist noch etwas los?

44
TTT

test ist der Name Ihres Bildes, das Sie mit 'docker build -t test' erstellt haben, kein Ordner /test.

Versuchen Sie ein Dockerfile mit:

CMD ["ls", "-lah", "/"]
or
CMD ["cat", "/file.json"]

Und:

docker run --rm -it -v $(pwd)/file.json:/file.json test

Beachten Sie die Verwendung von $(pwd), um eine Datei mit ihrem vollständigen absoluten Pfad bereitzustellen (relative Pfade werden nicht unterstützt).

34
VonC

Vielleicht ist das in den obigen Antworten klar ... aber ich habe einige Zeit gebraucht, um es in meinem Fall herauszufinden.

Der Grund dafür, dass die mit -v gemeinsam genutzte Datei als Verzeichnis anstelle einer Datei angezeigt wird, besteht darin, dass Docker die Datei nicht auf dem Host finden konnte. Daher erstellt Docker ein neues Verzeichnis im Container, dessen Name der Name der nicht vorhandenen Datei auf dem Host ist, da Docker davon ausgeht, dass der Benutzer nur ein Volume/Verzeichnis freigeben möchte, das in Zukunft erstellt wird.

Wenn Sie in dem oben genannten Problem ein relatives Verzeichnis im Befehl -v verwendet haben und docker keine relativen Verzeichnisse versteht, bedeutet dies, dass die Datei nicht auf dem Host gefunden wurde und docker daher ein Verzeichnis erstellt hat. Die obige Antwort, die die Verwendung von $ (pwd) vorschlägt, ist die richtige Lösung, wenn das Problem auf ein relatives Verzeichnis zurückzuführen ist.

Aber für diejenigen, die diese Seite lesen, die kein relatives Verzeichnis verwenden und dasselbe Problem haben ... dann versuchen Sie zu verstehen, warum die Datei auf dem Host fehlt.

Es könnte nur ein dummer Tippfehler sein ...

Möglicherweise führen Sie den Befehl "docker run" von einem Client aus, der den Docker-Container auf einem anderen Host erzeugt, und die gemeinsam genutzte Datei ist auf diesem anderen Host nicht vorhanden. Die mit -v gemeinsam genutzte Datei muss auf dem Host vorhanden sein, auf dem der Docker-Agent den Container erzeugt. Dies muss nicht unbedingt auf dem Client der Fall sein, auf dem der Befehl "docker run -v ..." ausgeführt wird viele Fälle).

Es gibt weitere mögliche Erklärungen für Mac und Windows ... das könnte es auch sein.

Die auf dem Host fehlende Datei ist also das Problem. Beheben Sie das Problem in Ihrem Setup. Die Verwendung von $ (pwd) könnte die Lösung sein, aber nicht immer.

47
Nikopol

Ich habe ein bisschen mit diesem Problem gestritten und es diagnostiziert, während Docker unter Windows ausgeführt wurde. Dies könnte sich auch auf Benutzer auswirken, die unter Mac OS X ausgeführt werden. Daher füge ich hier eine Antwort für Benutzer hinzu, die möglicherweise ein Problem in diesen Umgebungen haben, da mich meine Suche an diesen Ort geführt hat, und füge eine Erklärung hinzu, was in Docker anscheinend passiert.

Unter Windows oder Mac OS X wird Ihr Docker tatsächlich in einem boot2docker ausgeführt VM und nur das Benutzerverzeichnis wird standardmäßig freigegeben. Unter Windows wird dieses Benutzerverzeichnis jedoch als/c/Users/freigegeben In der mit Docker Machine gelieferten MinGW - Shell kann auf das Laufwerk als/C oder/c zugegriffen werden, sodass Sie verrückt werden können, wenn Sie vergessen, dass die Docker - Befehle tatsächlich für boot2docker ausgeführt werden VM und Ihre Dateipfade müssen auf dem boot2docker vorhanden sein VM) und in der Art und Weise angegeben werden, wie sie dort vorhanden sind, da im Docker anscheinend statt einer Warnung oder eines Fehlers das Verzeichnis/Ist die Datei nicht vorhanden, erstellt docker die angegebene Quelle im Hintergrund als Verzeichnis im boot2docker VM), sodass keine fertige Ausgabe vorhanden ist, die angibt, dass Sie etwas falsch machen.

Wenn Ihre Datei also wie in der obigen Antwort als Verzeichnis bereitgestellt wird, überprüfen Sie, ob Sie einen absoluten Pfad angeben. Überprüfen Sie unter Windows und Mac OS X, ob der absolute Pfad, den Sie bereitstellen, in Ihrer boot2docker-VM vorhanden ist.

20
JDL

Wenn Docker im Docker ausgeführt wird (durch Mounten von /var/run/docker.sock zum Beispiel), müssen Sie sich bewusst sein, dass, wenn Sie im Docker mounten, immer die Dateipfade auf Ihrem Host verwendet werden.

Wenn Sie also auf Ihrem Host Folgendes mounten:

-v /tmp/foobar.txt:/my/path/foobar.txt

sie sollten nicht das folgende Mount im Dock durchführen:

-v /my/path/foobar.txt:/my/other/path.txt

verwenden Sie stattdessen den Host-Dateipfad, z.

-v /tmp/foobar:txt:/my/other/path.txt
2
edi9999

Für Benutzer der VirtualBox-Maschine gibt es eine einfache Lösung. Standardmäßig wird der Ordner C:/User hinzugefügt. Wenn sich Ihr Projekt in C:/projects befindet, fügen Sie diesen Ordner hinzu, um ihn in VB (mit automount) verfügbar zu machen.

1
starski