906 Stimmen

Wie man ein Host-Verzeichnis in einem Docker-Container einbindet

Ich versuche, ein Host-Verzeichnis in einen Docker-Container zu mounten, damit alle Updates auf dem Host in den Docker-Containern reflektiert werden.

Wo mache ich einen Fehler. Hier ist, was ich gemacht habe:

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"]

kishore$ tree
.
 Dockerfile
 main_folder
     tfile1.txt
     tfile2.txt
     tfile3.txt
     tfile4.txt

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 -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/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 ..

kishore$ docker -v
Docker version 0.9.1, build 867b2a9
  • Ich weiß nicht, wie man die boot2docker-Version überprüft

Fragen, Probleme:

  1. Wie muss ich das main_folder mit dem im Docker-Container vorhandenen test_container-Ordner verknüpfen?
  2. Ich möchte das automatisieren. Wie kann ich das machen, ohne wirklich den run -d -v-Befehl zu verwenden?
  3. Was passiert, wenn boot2docker abstürzt? Wo sind die Docker-Dateien gespeichert (abgesehen vom Dockerfile)?

11voto

Tal Punkte 7599

Jul 2015 aktualisierung - boot2docker unterstützt jetzt direktes einbinden. Sie können -v /var/logs/on/host:/var/logs/in/container direkt von Ihrem Mac-Prompt verwenden, ohne doppeltes Einbinden

8voto

Emile Punkte 11106

Wie verlinke ich den main_folder mit dem test_container-Ordner im Docker-Container?

Ihr Befehl unten ist korrekt, es sei denn, Sie verwenden ein Mac mit Boot2docker (abhängig von zukünftigen Updates), in diesem Fall könnte der Ordner leer sein. Sehen Sie sich Mattes Antwort für ein Tutorial zur Korrektur an.

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

Ich möchte, dass dies automatisch ausgeführt wird, wie mache ich das ohne wirklich den run -d -v Befehl zu verwenden.

Sie können nicht wirklich um die Verwendung dieser Befehle herumkommen, da sie wesentlich für die Funktionsweise von Docker sind. Es wäre am besten, sie in ein Shell-Skript zu packen, um zu vermeiden, sie wiederholt eingeben zu müssen.

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

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

Wenn Sie 'docker build -t myimage .' mit einem Dockerfile verwendet haben, werden Ihre Dateien in das Image eingebacken.

Ihre Docker-Images werden, soweit ich weiß, in der boot2docker-vm gespeichert. Ich habe das herausgefunden, als meine Bilder verschwanden, als ich die vm aus VirtualBox gelöscht habe. (Hinweis: Ich weiß nicht, wie Virtualbox funktioniert, daher könnten die Bilder immer noch irgendwo versteckt sein, nur für Docker nicht sichtbar).

7voto

matthaeus Punkte 682

Hatte das gleiche Problem. Dies habe ich in der Docker-Dokumentation gefunden:

Hinweis: Das Host-Verzeichnis ist naturgemäß hostabhängig. Aus diesem Grund können Sie kein Host-Verzeichnis aus der Dockerdatei einbinden, da die VOLUME-Anweisung keine Übergabe eines Host-Verzeichnisses unterstützt, da die erstellten Images portabel sein sollten. Ein Host-Verzeichnis wäre auf allen potenziellen Hosts nicht verfügbar.

Das Einbinden eines Lese-/Schreib-Host-Verzeichnisses ist daher nur möglich mit dem -v Parameter im docker run Befehl, wie es die anderen Antworten richtig herausstellen.

7voto

Mansur Ul Hasan Punkte 2026

Ich habe festgestellt, dass jedes Verzeichnis, das unter einem Systemverzeichnis wie /var, /usr, /etc liegt, nicht unter dem Container gemountet werden kann.

Das Verzeichnis sollte im Benutzerbereich liegen -v -Switch weist den Docker-Dämon an, das lokale Verzeichnis in den Container zu mounten, zum Beispiel:

docker run -t -d -v /{lokal}/{pfad}:/{container}/{pfad} --name {container_name} {imagename}

7voto

J. Scott Elblein Punkte 3511

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 kleine Anmerkung, während all dieser Haare-ziehenden Arbeit, während ich damit kämpfen musste, Pfade herauszufinden und immer wieder neu einzugeben, entschied ich mich, ein kleines AutoHotkey-Skript zu schreiben, um einen Windows-Pfad in einen formatierten "Docker Windows"-Pfad umzuwandeln. Auf diese Weise muss ich nur einen beliebigen Windows-Pfad, den ich als Mount-Punkt verwenden möchte, in die Zwischenablage kopieren, die "Apps-Taste" auf der Tastatur drücken, und es wird in einem Pfadformat formatiert, das Docker schätzt.

Zum Beispiel:

Kopieren Sie dies in die Zwischenablage:

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

Drücken Sie die Apps-Taste, während der Cursor dort ist, wo Sie ihn auf der Befehlszeile haben möchten, und er wird dies dort einfügen:

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

Es spart mir viel Zeit. Hier ist es für alle, die es nützlich finden könnten.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Ein Windows-formatierter Pfad in einen Docker Formatter Pfad umwandeln
;                   Nützlich z.B. beim Mounten von Windows-Volumes über die Befehlszeile.
;
; Von:       J. Scott Elblein
; Version:  1.0
; Datum:    5.2.2019
;
; Verwendung: Schneiden oder Kopieren Sie den Windows-formatierten Pfad in die Zwischenablage, drücken Sie die Apps-Taste auf Ihrer Tastatur
;           (normalerweise direkt neben der Windows-Taste), es wird in einen 'Docker-Pfad' formatiert und in das aktive Fenster eingegeben.
;           Ein einfaches Beispiel wäre, den beabsichtigten Volumenpfad über den Explorer zu kopieren, den Cursor nach dem "-v" in Ihrem Docker-Befehl zu platzieren, die Apps-Taste zu drücken
;           und dann wird der formatierte Pfad für Sie auf die Zeile gesetzt.
;
; TODO::    Ich plane möglicherweise weitere Funktionen je nach Bedarf hinzuzufügen. Einige Ideen sind:
;           
;           - Ein Tray-Menü hinzufügen, mit der Möglichkeit, einige Dinge zu tun, z.B. den nicht formatierten Pfad auf der Zwischenablage nur durch den formatierten zu ersetzen
;           - 'Intelligenteres' Bearbeiten hinzufügen, damit es zuerst bestätigt, dass der Zwischenablage-Text überhaupt ein Pfad ist
;               (müsste mit Windows + Mac + Linux umgehen können)
;           - Befehlszeilenbearbeitung hinzufügen, damit das Skript nicht immer im Tray sein muss, es könnte
;               einfach den Windows-Pfad an das Skript übergeben, es formatieren, dann einfügen und schließen.
;               Außerdem könnte es einfach beim Start des Skripts nach einem Pfad in der Zwischenablage suchen, wenn gefunden
;               seine Arbeit erledigen und dann das Skript beenden.
;           - Eine 'Alles-in-einem'-Funktion hinzufügen, um den ausgewählten Windows-Pfad zu kopieren und dann das Ergebnis auszugeben.
;           - Was auch immer mir sonst noch einfällt.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Eine neue Variable erstellen, Inhalt der Zwischenablage speichern (sollte ein Windows-Pfad sein)
    NewStr := Clipboard

    ; Entfernen der ersten 2 Zeichen (sollte ein Laufwerksbuchstabe und Doppelpunkt sein) und Umwandlung des Buchstabens in Kleinbuchstaben
    ; HINWEIS: Ich könnte wahrscheinlich die folgenden 3 Zeilen durch einen regexreplace ersetzen, aber derzeit bin ich faul und in Eile.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Ersetzen des Großbuchstaben-Laufwerksbuchstabens und des Doppelpunkts durch den Kleinbuchstaben-Laufwerksbuchstaben und Doppelpunkt
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Ersetzen von Backslashes durch Schrägstriche
    NewStr := StrReplace(NewStr, "\", "/")

    ; Alle Doppelpunkte durch nichts ersetzen
    NewStr := StrReplace(NewStr, ":", "")

    ; Das letzte Zeichen entfernen, wenn es ein abschließender Schrägstrich ist
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Ein führendes Schrägstrich hinzufügen, wenn noch nicht vorhanden
    if RegExMatch(NewStr, "^/") == 0
        NewStr := "/" . NewStr

    ; Wenn im Pfad Leerzeichen vorhanden sind ... in doppelte Anführungszeichen setzen
    if RegExMatch(NewStr, " ") > 0
        NewStr := """" . NewStr . """"

    ; Das Ergebnis an das aktive Fenster senden
    SendInput % NewStr

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X