So mounten Sie ein Hostverzeichnis in einem Docker-Container

618

Ich versuche, ein Hostverzeichnis in einen Docker-Container einzubinden, damit alle auf dem Host vorgenommenen Aktualisierungen in den Docker-Containern wiedergegeben werden.

Wo mache ich etwas 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"]

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 /Users/kishore/main_folder:/test_container k3_s3:latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

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 ..

root@0f17e2313a46:/test_container# exit exit

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

  • Ich weiß nicht, wie ich die boot2docker-Version überprüfen soll

Fragen, Probleme:

  1. Wie muss ich den Ordner main_folder mit dem Ordner test_container verknüpfen, der im Docker-Container vorhanden ist?
  2. Ich muss das automatisch machen. Wie mache ich das, ohne den run -d -vBefehl wirklich zu benutzen ?
  3. Was passiert, wenn der boot2docker abstürzt? Wo werden die Docker-Dateien gespeichert (außer Dockerfile)?
Kishore Vaishnav
quelle
2
Zu Ihrer Information, dies scheint ab diesem Kommentar im Docker behoben zu sein. Ich verwende boot2docker auf meinem Mac. Ich kann die Option -v verwenden und mein lokales Verzeichnis wird vollständig in den Container eingebunden.
Marco

Antworten:

509

Es gibt verschiedene Möglichkeiten, dies zu tun. Der einfachste Weg, dies zu tun, besteht darin, den ADDBefehl dockerfile wie folgt zu verwenden :

ADD . /path/inside/docker/container

Änderungen, die nach dem Erstellen der Docker-Datei an diesem Verzeichnis auf dem Host vorgenommen wurden, werden jedoch nicht im Container angezeigt. Dies liegt daran, dass Docker beim Erstellen eines Containers das Verzeichnis in a komprimiert .tarund diesen Kontext dauerhaft in den Container hochlädt .

Die zweite Möglichkeit, 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 keinem Docker-Container-Verzeichnis in einer Docker-Datei zuordnen, da sich das Host-Verzeichnis je nach Computer ändern kann. Um ein Host-Verzeichnis einem Docker-Container-Verzeichnis zuzuordnen, müssen Sie das -vFlag verwenden, wenn Sie Docker wie folgt ausführen:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run
nhjk
quelle
Ich habe wie folgt versucht: kishore $ docker -v / Users / kishore / main_folder: / test_container Docker Version 0.9.1, Build 867b2a9 kishore $ docker run -v / Users / kishore / main_folder: / test_container Verwendung: docker run [OPTIONS] IMAGE [ BEFEHL] [ARG ...] Führen Sie einen Befehl in einem neuen Container aus -P, --publish-all = false: Veröffentlichen Sie alle exponierten Ports auf den Host-Schnittstellen -a, --attach = []: An stdin, stdout oder anhängen stderr. -c, --cpu-Shares = 0: CPU-Shares (relatives Gewicht)
Kishore Vaishnav
2
können Sie beide ADD haben. und -v Volume-Mount gleichzeitig. Verwenden Sie standardmäßig app_dir, wenn Sie keinen Host-Mount angeben.
Alexzg
@alexzg Ich glaube nicht, dass wir nur den ersten Vorrang haben können. Ich bin mir auch nicht sicher über Ihren 2. Punkt Standard app_dir ... Host Mount ..?
Kishore Vaishnav
35
Dies funktionierte für mich auf Mac OS X mit Docker-Maschine und VirtualBox. Eine Einschränkung, die ich durch Ausprobieren entdeckt habe, ist, dass das Host-Verzeichnis ein vollständiger Pfad und kein relativer Pfad sein muss.
jbustamovej
25
ADDwird tatsächlich nicht "gemountet", sondern kopiert die Datei in den Container, der darin verbleibt.
Kev
200

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

Um das lokale Verzeichnis innerhalb des Containerverzeichnisses synchron zu halten, müssen Sie das Volume mit dem Typ mounten bind. Dadurch werden das Quellverzeichnis (Ihr System) und das Zielverzeichnis (im Docker-Container) gebunden. Es ist fast das gleiche wie das Mounten eines Verzeichnisses unter Linux.

Laut Docker-Dokumentation lautet der entsprechende Befehl zum Mounten jetzt mountanstelle von -v. Hier ist seine Dokumentation:

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

  • Die typevon der Halterung, die sein kann bind, volumeodertmpfs . (Wir werden bind verwenden )

  • Das source des Reittiers. Bei Bindungs-Mounts ist dies der Pfad zu der Datei oder dem Verzeichnis auf dem Docker-Daemon-Host. Kann als sourceoder angegeben werden src.

  • Das destination Wert wird der Pfad verwendet, in dem die Datei oder das Verzeichnis im Container bereitgestellt wird. Kann wie folgt angegeben werden destination, dstoder target.

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 es nicht tun, würde ich verwenden`pwd` stattdessen :

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

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

Eduardo Santana
quelle
2
Ich habe Ihre Antwort positiv bewertet, weil ich es liebe, wie präzise sie ist und es nicht falsch ist, aber Sie möchten sie angesichts meiner Antwort unter stackoverflow.com/a/51829247/901899
rainabba
2
Ich denke, die Dokumentation wurde seit dieser Antwort aktualisiert, da sie derzeit eher Volumes als Mounts zu empfehlen scheint. Es lohnt sich, es durchzugehen, bevor Sie sich zu etwas verpflichten.
Sipty
1
@Sipty bezieht sich möglicherweise auf Folgendes: " Wenn Sie neue Docker-Anwendungen entwickeln, sollten Sie stattdessen benannte Volumes verwenden. Sie können Docker-CLI-Befehle nicht verwenden, um Bindungs-Mounts direkt zu verwalten. "
Aluthren
81

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

Grundsätzlich benötigen Sie 2 aufeinanderfolgende Reittiere:

Der erste, der ein Verzeichnis von Ihrem Host auf Ihrem System bereitstellt

das zweite, um das neue Verzeichnis von boot2docker wie folgt in Ihren Container zu mounten:

  • 1) Montieren Sie das lokale System boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Mounten Sie die boot2dockerDatei auf dem Linux-Container

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

Wenn Sie sich dann lsin der befinden containerfolder, sehen Sie den Inhalt Ihrer hostfolder.

Louis V.
quelle
1
Beste Antwort. Ich muss hinzufügen , dass (unter Windows) hostfolder in der Mount - Befehl in einen Ordner Freigabename ist beziehe. net shareDiejenige , die mit einem Befehl in einem Windows-Terminal (cmd) angezeigt wird. Und Sie müssen diesen als freigegebenen Ordner mit der virtualBox-GUI hinzufügen (mit demselben Namen, wenn Sie meiner Logik folgen). Wenn Sie es nicht freigeben, funktioniert es, aber Sie haben Probleme mit Berechtigungen und Aktualisierungsleistungen.
Kir Kanos
Woher kennt der Befehl mount den Host, auf dem sich / boot2dockerfolder befindet?
Alfonsodev
Ich habe den Fehler bekommen: mount: unknown filesystem type 'vboxsf'mit einem Ubuntu Gast und Host
nnyby
"vboxsf" ist der "Dateisystem" -Treiber für freigegebene VirtualBox-Ordner. Es muss in der VM konfiguriert werden, indem die VirtualBox-Erweiterungen installiert werden. Auf dem boot2docker-Image dürfen diese nicht installiert sein. VirtualBox verfügt über eine "Geräte" -Funktion zum "Einfügen" der ISO-Images von VirtualBox Additions als virtuelles Volume. Normalerweise können Sie dies beim Mounten mounten, indem Sie mount / dev / cdrom / mnt verwenden, in / mnt gehen und bash VBoxLinuxAdditions ausführen. Möglicherweise muss gcc, der Kernel oder andere Abhängigkeiten installiert werden.
Andrew Wolfe
mount.vboxsf: mounten fehlgeschlagen mit dem fehler: keine solche datei oder verzeichnis mounten: mounten von mymapfoldername auf / boot2dockerfolder fehlgeschlagen: keine solche datei oder verzeichnis
vee
71

Sie können die Option -v von cli aus 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 vom Host, das Sie bereitstellen möchten. Sie müssen sich keine Gedanken über das Verzeichnis des Containers machen, wenn es nicht vorhanden ist. Docker erstellt es.

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

rgaut
quelle
6
Was für ein schönes, sauberes und auf den Punkt gebrachtes Beispiel, um die Host-Mount-Option zu veranschaulichen. Es könnte möglicherweise durch die Verwendung eines realen Verzeichnisses verbessert werden: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashHier wird der Host /tmpauf dem Container bereitgestellt /tmp. Jetzt kann man touch /tmp/hello-worldaus dem Container die Datei auf dem Host sehen.
Stephan Henningsen
3
Funktioniert perfekt. Durch das Mounten auf diese Weise wird der Verzeichnisbesitzer als root festgelegt, und dies erwartet auch, dass der Container als root ausgeführt wird. Wie wird das Verzeichnis als Nicht-Root gemountet, wenn der Container als Nicht-Root ausgeführt wird?
Arun
33

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

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

Wie sich herausstellt, wird dies bereits in der Docker-Dokumentation erläutert . Wenn Sie docker run -v /var/logs/on/host:/var/logs/in/container ...dann tippen, /var/logs/on/hostwird tatsächlich vom boot2dockerVM-Image abgebildet , nicht von Ihrem Mac.

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

user3680997
quelle
1
Vielen Dank! Dies half mir bei einem entfernt verwandten Problem. Postgres, das in Docker ausgeführt wurde, war an die VBox-IP gebunden, nicht an den lokalen Host, wie es der Fall gewesen wäre, wenn es nicht unter OS X ausgeführt worden wäre.
Peter Becich
2
Diese URL zur Docker-Dokumentation ist nicht mehr gültig
digitaldavenyc
haha der beste Witz aller Zeiten .. sie hätten wirklich einen Hinweis machen können oder so.
user2834172
2
Ihr Dokumentationslink ist ein 404
Factor Mystic
3
Ich bin gespannt auf ein Beispiel für das Weiterleiten des freigegebenen Ordners über die VM an den tatsächlichen Host.
Derek
28

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

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

Zuerst ssh in die Docker-Maschine vm und erstelle den Ordner, dem wir zuordnen werden:

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

Geben Sie nun den Ordner für VirtualBox frei:

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

Zum Schluss ssh wieder in die Docker-Maschine und mounte den Ordner, den wir gerade geteilt 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 nicht bereits verwendet wurden.

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

Eli
quelle
1
+1. Nach mehreren Stunden Kopfschlag funktionierte Ihre Antwort. Dies sollte Teil des docker-machineDokuments sein.
Abhijit Sarkar
Warum nicht die -vFlagge benutzen ?
igracia
1
@igracia Das -vFlag funktioniert nicht wie in OS X (oder Windows) erwartet. Docker wird in einer VM ausgeführt, sodass der Ordner, auf den in verwiesen wird, -vauf einen Ordner in der VM verweist, nicht im Stammbetriebssystem. Mit dieser Technik wird der VM-Ordner im nächsten Schritt wieder dem Stammbetriebssystem zugeordnet.
Patrick Gunderson
1
@PatrickGunderson In meinem Fall (OS X) befindet sich der Ordner auf dem Host, nicht auf der VM, und er funktioniert einwandfrei. Docker Tolls kümmern sich um den Export auf die VM und von dort in den Container.
igracia
1
Die einzige Ausnahme von der Regel, die ich erwähnt habe, ist, dass die VM automatisch /Usersfür die Freigabe an Docker bereitgestellt wird. Das heißt, wenn Ihre Arbeitsdateien vorhanden sind, können ~/*Sie loslegen. Wenn Sie Ihre Dev-Umgebung so eingerichtet haben, dass sie nicht mehr funktioniert/development oder etwas anderes als /UsersSie Probleme haben, docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson
27

Ich experimentiere nur damit, meine SailsJS-App in einem Docker-Container zum Laufen zu bringen, um meine physische Maschine sauber zu halten.

Ich verwende den folgenden Befehl, um meine SailsJS / NodeJS-Anwendung unter / app zu mounten:

cd my_source_code_folder
Docker-Lauf -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc
Sven
quelle
5
Wie kann das in der Docker-Datei gemacht werden?
Orad
23
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. Sie funktioniert einwandfrei, wenn Sie das -tFlag hinzufügen .

Ali
quelle
Können Sie Dateien aus lokalem FS erstellen / aktualisieren und die Änderungen im Docker-Container anzeigen?
Avi Mehenwal
14

Wenn der Host Windows 10 ist, verwenden Sie anstelle des Schrägstrichs den 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 Freigabeberechtigung einzuholen, nachdem ich den obigen Befehl ausgeführt habe.

Duke79
quelle
13

So mounten Sie unter Mac OS einen Ordner /Users/<name>/projects/auf Ihrem Mac im Stammverzeichnis Ihres Containers:

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects

Bormat
quelle
11

Update Juli 2015 - boot2docker unterstützt jetzt die direkte Montage. Sie können -v /var/logs/on/host:/var/logs/in/containerdirekt von Ihrer Mac-Eingabeaufforderung aus verwenden, ohne doppelt zu mounten

Tal
quelle
11

Für Windows 10- Benutzer ist es wichtig, dass sich der Einhängepunkt im C:/Users/Verzeichnis befindet. Ich habe stundenlang versucht, das 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

Um es dann zu testen, können Sie es echo TEST > hostTest.txtin Ihrem Bild tun . Sie sollten diese neue Datei im lokalen Hostordner unter sehen können C:/Users/C/Desktop/dockerStorage/.

KF
quelle
Die doppelten Schrägstriche auf dem Weg haben es für mich zum Funktionieren gebracht. Es war verwirrend, weil ich -v $(pwd):/var/xxzuerst verwendet habe und das funktionierte, aber zu einem leeren Verzeichnis führte. Ich laufe Cyg via Babun.
Kenchilada
Hatte das gleiche Problem in Windows 7 bei der Verwendung von / c / data /, das Verschieben des Host-Verzeichnisses unter / c / Users / <Benutzer> / löste es für mich. Vielen Dank.
user8675309
1
Können wir einen Link zu dem Beitrag haben, der Ihnen bei der Lösung des Problems geholfen hat?
PBo
11

Ich habe das gleiche Problem gehabt. Meine Kommandozeile sah folgendermaßen 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
NikitQa
quelle
1
Wofür ist das z?
hhh
2
Die Option z gibt an, dass der Bind-Mount-Inhalt von mehreren Containern gemeinsam genutzt wird.
Jason
10

Ab Docker 18-CE können Sie verwenden docker run -v /src/path:/container/path einen Hostordner in beide Richtungen binden.

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 kennt das gesamte / Dateisystem, während Ihr Windows-Host nur Ihre Laufwerke kennt. Innerhalb der WSL können Sie / mnt / c / projectpath verwenden, aber wenn Sie es versuchendocker run -v ${PWD}:/projectpath , werden Sie auf dem Host feststellen, dass / projectpath / leer ist, da / mnt auf dem Host nichts bedeutet.

Wenn Sie jedoch von / c / projectpath aus arbeiten und DANN tun docker run -v ${PWD}:/projectpath Sie feststellen, dass / projectpath / c / projectpath in Echtzeit im Container wiedergibt. Es gibt keine Fehler oder andere Möglichkeiten, um dieses Problem zu erkennen, außer leere Halterungen in Ihrem Gast zu sehen.

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

rainabba
quelle
Ich habe dieses Problem mit Win10 / WSL und Docker-CE / Docker-CE. Leer / Projektpfad /. Was meinst du mit "Arbeit aus / c / Projektpfad"? Ich habe versucht, / c / mit / mnt / c zu verknüpfen und von dort aus zu laufen, /c/projectpathaber dann erhalte ich den Fehler bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder
Dieser Link löste mein Problem: support.divio.com/local-development/docker/… (Docker unter Windows erlaubt nur das Mounten von / Users / standardmäßig)
Steven T. Snyder
7

Ich fand heraus, dass ein Verzeichnis, das unter einer Systemanweisung wie /varliegt /usr, /etcnicht unter dem Container bereitgestellt werden konnte.

Die Direktive sollte sich am Space -vSwitch des Benutzers befinden. Der Docker-Daemon wird angewiesen, das lokale Verzeichnis in den Container zu mounten. Beispiel:

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

boot2docker zusammen mit VirtualBox Guest Additions
So mounten Sie / Users in boot2docker

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

Erstellen Sie Ihre eigene benutzerdefinierte boot2docker.iso mit VirtualBox Guest Additions (siehe Link ) oder laden Sie http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso herunter und speichern Sie sie zu ~ / .boot2docker / boot2docker.iso.

matten
quelle
Ich habe versucht, diese ISO zu verwenden, und bin immer noch auf dieselben Probleme gestoßen ... Die Verwendung der in diesem Beitrag beschriebenen Anweisungen hat mir jedoch geholfen, das Problem zu lösen - ich musste im Grunde den freigegebenen Ordner erzwingen.
Jaco Pretorius
Ich habe die ISO verwendet und bin darauf gestoßen, dass ich die Virtual Box-VM nicht gestoppt habe, bevor ich den Cmd 'VBoxManage Shared Folder Add ...' aufgerufen habe. Endlich hat alles geklappt, obwohl ich mich so sehr bedanke.
Emile
Hinweis: Der Grund, warum das Argument -v nicht über boot2docker funktioniert, hängt anscheinend damit zusammen, dass es auf boot2docker-vm und nicht auf Ihrem tatsächlichen Host bereitgestellt wird. Aus diesem Grund denke ich, dass der Vboxmanage-Teil dazu beiträgt, dass es funktioniert.
Emile
5

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

Der folgende Befehl ist korrekt, es sei denn, Sie verwenden boot2docker auf einem Mac (abhängig von zukünftigen Updates). In diesem Fall ist der Ordner möglicherweise leer. In der Mattes-Antwort finden Sie ein Tutorial zur Korrektur.

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

Ich muss dies automatisch ausführen lassen, wie das geht, ohne den Befehl run -d -v wirklich zu verwenden.

Sie können nicht wirklich davonkommen, diese Befehle zu verwenden. Sie sind für die Funktionsweise von Docker von wesentlicher Bedeutung. Am besten fügen Sie sie in ein Shell-Skript ein, damit Sie sie nicht wiederholt ausschreiben müssen.

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

Wenn Sie das Argument -v verwenden und auf Ihren Hostcomputer 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 eingebrannt.

Ich glaube, Ihre Docker-Images sind im boot2docker-vm gespeichert. Ich fand dies heraus, als meine Bilder verschwanden, als ich die VM aus VirtualBox löschte. (Hinweis, ich weiß nicht, wie Virtualbox funktioniert, daher sind die Bilder möglicherweise noch an einer anderen Stelle versteckt und für Docker nur nicht sichtbar.)

Emile
quelle
5

Hatte das gleiche Problem. Fand dies in der Docker-Dokumentation :

Hinweis: Das Hostverzeichnis ist naturgemäß hostabhängig. Aus diesem Grund können Sie kein Hostverzeichnis aus Dockerfile bereitstellen. Die Anweisung VOLUME unterstützt die Übergabe eines Hostverzeichnisses nicht, da erstellte Images portabel sein sollten. Ein Hostverzeichnis wäre nicht auf allen potenziellen Hosts verfügbar.

Das Mounten eines Lese- / Schreibhostverzeichnisses ist also nur mit dem -vParameter im docker runBefehl möglich, wie die anderen Antworten richtig zeigen.

matthaeus
quelle
Was genau ist das Hostverzeichnis?
Nicolas S.Xu
@ NicolasS.Xu Beliebiger Pfad auf dem tatsächlichen Docker-Host-Computer.
J. Scott Elblein
5

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 Randnotiz entschied ich mich, während all dieser Haare zu ziehen, mit dem Herausfinden zu kämpfen und Pfade immer und immer wieder neu einzugeben, ein kleines AutoHotkeySkript zu erstellen , um einen Windows-Pfad in einen "Docker Windows " -formatierten Pfad zu konvertieren . Auf diese Weise muss ich nur einen Windows-Pfad, den ich als Einhängepunkt verwenden möchte, in die Zwischenablage kopieren, die "Apps-Taste" auf der Tastatur drücken und ihn in ein Pfadformat formatieren, das Docker zu schätzen weiß.

Zum Beispiel:

Kopieren Sie dies in Ihre Zwischenablage:

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

Drücken Sie die Apps KeyTaste, während sich der Cursor in der Befehlszeile an der gewünschten Stelle befindet, und fügen Sie diese dort ein:

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

Spart mir viel Zeit. Hier ist es für alle anderen, die es nützlich finden können.

; --------------------------------------------------------------------------------------------------------------
;
; 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 
J. Scott Elblein
quelle
4

Damit dies in Windows 10 funktioniert, musste ich das Fenster Docker-Einstellungen in der Taskleiste öffnen und zum Abschnitt Freigegebene Laufwerke wechseln.

Ich habe dann das Kästchen neben angekreuzt C. Docker fragte nach meinen Desktop-Anmeldeinformationen, um die Berechtigung zum Schreiben in meinen Benutzerordner zu erhalten.

Dann habe ich den Docker-Container gemäß den obigen Beispielen und dem Beispiel auf dieser Einstellungsseite ausgeführt und /dataim Container angehängt.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Adam Smith
quelle
3

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

Unten hat für mich gearbeitet.

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

Ich hatte die gleichen Probleme, ich habe versucht, C: \ Users \ Ordner auf Docker zu mounten.
So habe ich es gemacht Docker Toolbox Befehlszeile

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
Abhishek DK
quelle
2

Ich hatte die gleiche Anforderung, das Hostverzeichnis aus dem Container zu mounten, und habe den Befehl zum Einhängen des Volumes verwendet. Beim Testen wurde jedoch festgestellt, dass auch Dateien im Container erstellt werden. Nach einigem Graben stellte sich jedoch heraus, dass es sich nur um symbolische Links und das tatsächliche Dateisystem handelt, das vom Host-Computer verwendet wird.

Sunil Chauraha
quelle
2

Sie können dies auch mit Portainer tun Webanwendung um eine andere visuelle Erfahrung .

Ziehen Sie zuerst das Portainer-Bild:

docker pull portainer/portainer

Erstellen Sie dann ein Volume für Portainer:

docker volume create portainer_data

Erstellen Sie auch einen Portainer-Container:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Sie können mit Ihrem Browser unter folgender URL auf die Web-App zugreifen: " http: // localhost: 9000 ". Bei der ersten Anmeldung werden Sie aufgefordert, Ihre Portainer-Administratoranmeldeinformationen festzulegen.

Befolgen Sie in der Web-App die folgenden Menüs und Schaltflächen: (Container> Container hinzufügen > Fülleinstellungen> Container bereitstellen)

Ich hatte Probleme beim Erstellen eines "Mount" -Volumes mit Portainer und stellte fest, dass ich beim Erstellen des Volumes meines Containers auf "Binden" klicken musste. Unten finden Sie eine Abbildung der Einstellungen für die Datenträgerbindung, die für meine Containererstellung mit einem an den Host gebundenen bereitgestellten Datenträger funktioniert haben.

Volumenbindungseinstellungen

PS: Ich verwende Docker 19.035 und Portainer 1.23.1

Michael Fayad
quelle