it-swarm.com.de

Wie mounten Sie ein Host-Verzeichnis in einem Docker-Container

Ich versuche, ein Host-Verzeichnis in einen Docker-Container einzuhängen, damit alle auf dem Host vorgenommenen Aktualisierungen in den Docker-Containern angezeigt werden. Nach dem Googeln und Lesen der Docker-Volume-Links konnte ich nicht erfolgreich sein.

Wo mache ich was falsch? Folgendes habe ich getan:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

</ code></ pre>

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore $ docker run -d -v/Benutzer/kishore/main_folder:/test_container k3_s3: latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea</ code></ pre>

kishore$ docker run -i -t k3_s3:latest /bin/bash

[email protected]:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root @ 0f17e2313a46:/test_container # exit exit</ code></ pre>

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • Ich weiß nicht, wie man die boot2docker-Version überprüft

Fragen und Probleme

  1. Wie muss ich den Hauptordner mit dem Ordner test_container im Docker-Container verknüpfen?
  2. Ich muss das automatisch machen. Wie mache ich das, ohne den run -d -v-Befehl wirklich zu verwenden?
  3. Was passiert, wenn der boot2docker abstürzt? Wo werden die Docker-Dateien (außer Dockerfile) gespeichert?
420

Es gibt mehrere Möglichkeiten, dies zu tun. Am einfachsten ist es, den dockerfile-Befehl ADD so zu verwenden:

ADD . /path/inside/docker/container

Änderungen, die nach der Erstellung der Docker-Datei an diesem Verzeichnis auf dem Host vorgenommen wurden, werden jedoch nicht im Container angezeigt. Dies liegt daran, dass das Docker beim Erstellen eines Containers das Verzeichnis in einen .tar komprimiert und diesen context permanent in den Container lädt.

Der zweite Weg, dies zu tun, ist die Art und Weise, wie Sie versucht haben, ein Volume bereitzustellen. Da Sie versuchen, so portabel wie möglich zu sein, können Sie ein Host-Verzeichnis nicht einem Docker-Container-Verzeichnis in einer Docker-Datei zuordnen, da sich das Host-Verzeichnis je nach dem Computer ändern kann, auf dem Sie arbeiten. Um ein Host-Verzeichnis einem Docker-Containerverzeichnis zuzuordnen, müssen Sie das Flag -v verwenden, wenn Sie Docker-Run wie folgt verwenden:

docker run -v /Host/directory:/container/directory -other -options image_name command_to_run
347
nhjk

Der Benutzer dieser Frage verwendete Docker version 0.9.1, build 867b2a9, ich werde Ihnen eine Antwort für Docker-Version> = 17.06 geben.

Wenn Sie möchten, dass das lokale Verzeichnis innerhalb des Containerverzeichnisses synchronisiert wird, können Sie das Volume mit dem Typ bind einhängen. Dadurch werden die Quellverzeichnisse (Ihr System) und die Zielverzeichnisse (im Docker-Container) gebunden. Es ist fast das Gleiche wie das Anhängen eines Verzeichnisses unter Linux.

Laut Docker-Dokumentation ist der entsprechende Befehl zum Einhängen jetzt mount anstelle von -v. Hier ist seine Dokumentation:

  • --mount: Besteht aus mehreren durch Kommas getrennten Schlüssel-Wert-Paaren. Jedes Schlüssel/Wert-Paar hat die Form eines <key>=<value>-Tupels. Die --mount-Syntax ist ausführlicher als -v oder --volume, aber die Reihenfolge der Schlüssel ist nicht signifikant und der Wert des Flags ist einfacher zu verstehen.

  • Die type des Mount, die bind, volume oder tmpfs sein kann. (Wir verwenden bind)

  • Die source des Mount. Bei Bind-Mounts ist dies der Pfad zur Datei oder zum Verzeichnis auf dem Docker-Daemon-Host. Kann als source oder src angegeben werden.

  • Die Variable destination nimmt den Pfad, unter dem die Datei oder das Verzeichnis in den Container eingehängt werden soll. Kann als destination, dst oder target angegeben werden.

Um das aktuelle Verzeichnis (Quelle) mit /test_container (Ziel) zu mounten, verwenden wir:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

Wenn diese Mount-Parameter Leerzeichen enthalten, müssen Sie sie in Anführungszeichen setzen. Wenn ich weiß, dass sie dies nicht tun, würde ich stattdessen `pwd` verwenden:

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

Sie müssen sich auch mit der Dateiberechtigung befassen, siehe diesen Artikel .

130
Eduardo Santana

2 aufeinanderfolgende Mounts: Ich denke, viele Posts hier verwenden möglicherweise zwei boot2docker. Der Grund, warum Sie nichts sehen, ist, dass Sie ein Verzeichnis von boot2docker nicht von Ihrem Host aus einhängen.

Grundsätzlich benötigen Sie zwei aufeinanderfolgende Aktivierungen: Die erste, die ein Verzeichnis von Ihrem Host in Ihr System einbindet, und die zweite, um das neue Verzeichnis von boot2docker wie folgt in Ihren Container einzuhängen:

1. Mounten Sie das lokale System auf boot2docker

Sudo mount -t vboxsf hostfolder /boot2dockerfolder

2. Mounten Sie die boot2docker-Datei im Linux-Container

docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename

Wenn Sie dann im Containerordner ls sind, wird der Inhalt Ihres Hostordners angezeigt.

62
louis V

sie können die Option -v von cli verwenden. Diese Funktion ist nicht über Dockerfile verfügbar

docker run -t -i -v <Host_dir>:<container_dir> ubuntu /bin/bash

dabei ist Host_dir das Verzeichnis von Host, das Sie einhängen möchten. Sie brauchen sich nicht um das Verzeichnis des Containers zu kümmern, wenn es nicht existiert.

Wenn Sie Änderungen an Host_dir vom Host-Computer aus vornehmen (unter Root-Berechtigung), ist dies für den Container und umgekehrt sichtbar. 

49
rgaut

Ist es möglich, dass Sie das Docker unter OS X über boot2docker oder ähnliches verwenden. 

Ich habe die gleiche Erfahrung gemacht - der Befehl ist korrekt, aber im Container ist sowieso nichts (sinnvoll) montiert.

Wie es sich herausstellt - es ist bereits in der Docker-Dokumentation erklärt . Wenn Sie docker run -v /var/logs/on/Host:/var/logs/in/container ... eingeben, wird /var/logs/on/Host tatsächlich aus dem boot2docker-VM-Image zugeordnet, nicht von Ihrem Mac. 

Sie müssen den freigegebenen Ordner über Ihren VM an Ihren tatsächlichen Host (den Mac in meinem Fall) weiterleiten.

31
user3680997

[UPDATE] Ab ~ Juni 2017 kümmert sich Docker für Mac um all die lästigen Teile, bei denen Sie sich mit VirtualBox herumschlagen müssen. Damit können Sie im Wesentlichen alles auf Ihrem lokalen Host mit dem Präfix /private zuordnen. Mehr Infos hier . [/ UPDATE]

Alle aktuellen Antworten beziehen sich auf Boot2docker. Da dies jetzt zugunsten von Docker-Maschinen veraltet ist, funktioniert dies für Docker-Maschinen:

Zuerst ssh in die Docker-Maschine-VM und erstellen Sie den Ordner, dem wir zuordnen wollen:

docker-machine ssh $MACHINE_NAME "Sudo mkdir -p \"$VOL_DIR\""

Jetzt den Ordner für VirtualBox freigeben:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Schließlich ssh wieder in die Docker-Maschine und mounten Sie den Ordner, den wir gerade freigegeben haben:

docker-machine ssh $MACHINE_NAME "Sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Hinweis: Für UID und GID können Sie grundsätzlich beliebige Ganzzahlen verwenden, sofern diese noch nicht belegt sind.

Dies wird ab Docker-Maschine 0.4.1 und Docker 1.8.3 unter OS X El Capitan getestet.

25
Eli

Ich experimentiere nur damit, dass meine SailsJS-App in einem Docker-Container ausgeführt wird, um meine physische Maschine sauber zu halten.

Ich benutze den folgenden Befehl, um meine SailsJS/NodeJS-Anwendung unter/app einzuhängen:

 cd my_source_code_folder 
 docker run -it -p 1337: 1337 -v $ (pwd):/app my_docker/image_with_nodejs_etc.
24
Sven
docker run -v /Host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

In meinem System habe ich die Antwort von nhjk korrigiert. Es funktioniert einwandfrei, wenn Sie das Flag -t hinzufügen.

16
Ali

Update für Juli 2015 - boot2docker unterstützt jetzt das direkte Mounten. Sie können -v /var/logs/on/Host:/var/logs/in/container direkt von Ihrer Mac-Eingabeaufforderung aus verwenden, ohne dass ein Doppelmounten erforderlich ist

10
Tal

Ich hatte das gleiche Problem ... Meine Kommandozeile sah so aus:

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

Das Problem war mit 'pwd'. Also habe ich das in $ (pwd) geändert:

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
9
NikitQa

Wenn der Host Windows 10 ist, verwenden Sie anstelle des Schrägstrichs den umgekehrten Schrägstrich.

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

Stellen Sie sicher, dass das Host-Laufwerk freigegeben ist (in diesem Fall C). In meinem Fall wurde ich aufgefordert, die Freigabe zuzulassen, nachdem der obige Befehl ausgeführt wurde.

7
Duke79

Ich habe festgestellt, dass jedes Verzeichnis, das unter der Systemanweisung wie /var, /usr, /etc liegt, nicht unter dem Container bereitgestellt werden kann.

Die Direktive sollte sich im Bereich -v des Benutzers befinden, der den Docker-Daemon anweist, das lokale Verzeichnis in den Container einzuhängen. Beispiel:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}
6
Mansur Ali

Wie verknüpfe ich den Hauptordner mit dem Ordner test_container im Docker-Container?

Ihr Befehl ist korrekt, es sei denn, Ihr Mac verwendet boot2docker (abhängig von zukünftigen Updates). In diesem Fall finden Sie den Ordner möglicherweise leer. Sehen Sie sich mattes Antwort für ein Tutorial zur Korrektur dieses Problems an.

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

Ich muss das automatisch ausführen lassen, wie das geht, ohne dass wirklich Mit dem Befehl run -d -v ausgeführt wird.

Sie können diese Befehle nicht wirklich verwenden, sie sind für die Funktionsweise von Docker wesentlich. Sie sollten sie am besten in ein Shell-Skript einfügen, damit Sie sie nicht wiederholt schreiben müssen. 

Was passiert, wenn boot2docker abstürzt? Wo werden die Docker-Dateien gespeichert?

Wenn Sie das Argument -v verwenden und auf Ihren Host-Computer verweisen, sind die Dateien auf Ihrem Host sicher.

Wenn Sie "docker build -t myimage" verwendet haben. Mit einer Docker-Datei werden Ihre Dateien in das Bild eingebettet.

Ich glaube, Ihre Docker-Images werden in boot2docker-vm gespeichert. Ich habe dies herausgefunden, als meine Bilder verschwunden sind, als ich die VM aus VirtualBox lösche. (Beachten Sie, ich weiß nicht, wie Virtualbox funktioniert, daher sind die Bilder möglicherweise noch woanders versteckt, nur für Docker nicht sichtbar).

4
Emile

Hatte das gleiche Problem. Fand dies in der docker Dokumentation

Hinweis: Das Host-Verzeichnis ist seiner Natur nach Host-abhängig. Aus diesem Grund können Sie kein Host-Verzeichnis von Dockerfile aus einhängen. Die VOLUME-Anweisung unterstützt das Übergeben eines Host-Verzeichnisses nicht, da erstellte Images portierbar sein sollten. Ein Host-Verzeichnis wäre nicht auf allen potenziellen Hosts verfügbar.

Das Mounten eines Lese-/Schreib-Host-Verzeichnisses ist daher nur mit dem Parameter -v im Befehl docker run möglich, da die anderen Antworten korrekt darauf hinweisen.

4
matthaeus

boot2docker zusammen mit VirtualBox Guest Additions
Wie man/Benutzer in boot2docker einbindet

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-zusammen-mit-virtualbox-guest-additions-da1e3ab2465c

tl; dr Erstellen Sie mit VirtualBox Guest .__ Ihre eigene benutzerdefinierte boot2docker.iso. Ergänzungen (siehe link ) oder Download http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso und speichern Sie es in ~/.boot2docker/boot2docker.iso.

4
mattes

Für Benutzer von Windows 10 ist es wichtig, dass der Einhängepunkt im Verzeichnis C:/Users/ liegt. Ich habe stundenlang versucht, dies zum Laufen zu bringen. Dieser Beitrag hat geholfen, war aber zunächst nicht offensichtlich, da die Lösung für Windows 10 ein Kommentar zu einer akzeptierten Antwort ist. So habe ich es gemacht:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

Dann können Sie es testen, indem Sie echo TEST > hostTest.txt in Ihrem Bild ausführen. Sie sollten diese neue Datei im lokalen Hostordner unter C:/Users/C/Desktop/dockerStorage/ sehen können. 

3
K F

Hier ist ein Beispiel mit einem Windows-Pfad:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

Als Randbemerkung entschied ich mich, während all dieser Haare zu ziehen, immer wieder mit rauszufinden und Wege immer wieder neu einzugeben, ein kleines AutoHotkey-Skript, um einen Windows-Pfad in ein "Docker-Windows zu konvertieren "formatierter Pfad. Auf diese Weise muss ich lediglich jeden Windows-Pfad, den ich als Einhängepunkt verwenden möchte, in die Zwischenablage kopieren, die "Apps-Taste" auf der Tastatur drücken und das Format in einem Pfadformat formatieren, das Docker zu schätzen weiß.

Zum Beispiel:

Kopiere dies in deine Zwischenablage:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

drücken Sie den Apps Key, während sich der Cursor an der gewünschten Stelle in der Befehlszeile befindet, und fügen Sie ihn dort ein:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

Spart mir viel Zeit. Hier ist es für jeden, der es für nützlich hält.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a Rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 
3

Ab Docker 18-CE können Sie mit docker run -v /src/path:/container/path eine bidirektionale Bindung eines Host-Ordners durchführen.

Hier gibt es jedoch einen großen Haken, wenn Sie mit Windows 10/WSL arbeiten und Docker-CE für Windows als Host und dann Docker-Ce-Client-Tools in WSL verwenden. WSL weiß über das gesamte/Dateisystem Bescheid, während Ihr Windows Host nur über Ihre Laufwerke Bescheid weiß. In der WSL können Sie/mnt/c/projectpath verwenden. Wenn Sie jedoch docker run -v ${PWD}:/projectpath versuchen, werden Sie im Host feststellen, dass/projectpath/leer ist, da auf dem Host/mnt nichts bedeutet.

Wenn Sie von/c/projectpath aus arbeiten und THEN docker run -v ${PWD}:/projectpath und Sie werden feststellen, dass sich im Container/projectpath/c/projectpath in Echtzeit befindet. Es gibt keine Fehler oder andere Möglichkeiten, dieses Problem zu erkennen, als leere Mounts in Ihrem Gast zu sehen.

Sie müssen außerdem sicherstellen, dass Sie das Laufwerk in den Docker for Windows-Einstellungen freigeben.

3
rainabba

Beachten Sie, dass Sie in Windows den absoluten Pfad angeben müssen.

Unten arbeitete ich für mich.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash
1
Chankey Pathak

ich hatte die gleichen Probleme und versuchte, den Ordner C:\Users\auf dem Docker anzuhängen 
So habe ich es gemacht Docker Toolbox Befehlszeile

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
1
Abhishek D K

Ich hatte die gleiche Anforderung, das Host-Verzeichnis aus dem Container zu mounten, und verwendete den Befehl zum Laden des Volumes. Während des Tests ist jedoch aufgefallen, dass auch Dateien in Containern erstellt werden. Nach einigem Nachforschen wurden jedoch nur symbolische Links und das eigentliche Dateisystem des Host-Computers gefunden.

0
Sunil Chauraha