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 DockerfileFROM 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.txt1 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
- Wie muss ich den Hauptordner mit dem Ordner test_container im Docker-Container verknüpfen?
- Ich muss das automatisch machen. Wie mache ich das, ohne den
run -d -v
-Befehl wirklich zu verwenden? - Was passiert, wenn der boot2docker abstürzt? Wo werden die Docker-Dateien (außer Dockerfile) gespeichert?
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
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 .
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:
Sudo mount -t vboxsf hostfolder /boot2dockerfolder
docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
Wenn Sie dann im Containerordner ls
sind, wird der Inhalt Ihres Hostordners angezeigt.
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.
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.
[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.
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.
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.
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
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
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.
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}
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).
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.
boot2docker zusammen mit VirtualBox Guest Additions
Wie man/Benutzer in boot2docker einbindet
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.
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.
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
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.
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
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>
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.