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:
- Wie muss ich den Ordner main_folder mit dem Ordner test_container verknüpfen, der im Docker-Container vorhanden ist?
- Ich muss das automatisch machen. Wie mache ich das, ohne den
run -d -v
Befehl wirklich zu benutzen ? - Was passiert, wenn der boot2docker abstürzt? Wo werden die Docker-Dateien gespeichert (außer Dockerfile)?
docker
mount
boot2docker
Kishore Vaishnav
quelle
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, dies zu tun. Der einfachste Weg, dies zu tun, besteht darin, den
ADD
Befehl dockerfile wie folgt zu verwenden :Ä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
.tar
und 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
-v
Flag verwenden, wenn Sie Docker wie folgt ausführen:quelle
ADD
wird tatsächlich nicht "gemountet", sondern kopiert die Datei in den Container, der darin verbleibt.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
mount
anstelle 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--mount
Syntax ist ausführlicher als-v
oder--volume
, aber die Reihenfolge der Schlüssel ist nicht signifikant und der Wert des Flags ist leichter zu verstehen.Die
type
von der Halterung, die sein kannbind
,volume
odertmpfs
. (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 alssource
oder angegeben werdensrc
.Das
destination
Wert wird der Pfad verwendet, in dem die Datei oder das Verzeichnis im Container bereitgestellt wird. Kann wie folgt angegeben werdendestination
,dst
odertarget
.Um das aktuelle Verzeichnis (Quelle) mit
/test_container
(Ziel) zu mounten, verwenden wir: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 :Sie müssen sich auch mit Dateiberechtigungen befassen, siehe diesen Artikel .
quelle
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:
1) Montieren Sie das lokale System
boot2docker
2) Mounten Sie die
boot2docker
Datei auf dem Linux-ContainerWenn Sie sich dann
ls
in der befindencontainerfolder
, sehen Sie den Inhalt Ihrerhostfolder
.quelle
net share
Diejenige , 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.mount: unknown filesystem type 'vboxsf'
mit einem Ubuntu Gast und HostSie 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.
quelle
docker run -t -i -v /tmp:/tmp ubuntu /bin/bash
Hier wird der Host/tmp
auf dem Container bereitgestellt/tmp
. Jetzt kann mantouch /tmp/hello-world
aus dem Container die Datei auf dem Host sehen.Ist es möglich, dass Sie Docker unter OS X über
boot2docker
oder ä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/host
wird tatsächlich vomboot2docker
VM-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.
quelle
[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
/private
Prä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:
Geben Sie nun den Ordner für VirtualBox frei:
Zum Schluss ssh wieder in die Docker-Maschine und mounte den Ordner, den wir gerade geteilt haben:
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.
quelle
docker-machine
Dokuments sein.-v
Flagge benutzen ?-v
Flag funktioniert nicht wie in OS X (oder Windows) erwartet. Docker wird in einer VM ausgeführt, sodass der Ordner, auf den in verwiesen wird,-v
auf einen Ordner in der VM verweist, nicht im Stammbetriebssystem. Mit dieser Technik wird der VM-Ordner im nächsten Schritt wieder dem Stammbetriebssystem zugeordnet./Users
fü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/Users
Sie Probleme haben, docs.docker.com/engine/userguide/containers/dockervolumesIch 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:
quelle
In meinem System habe ich die Antwort von nhjk korrigiert. Sie funktioniert einwandfrei, wenn Sie das
-t
Flag hinzufügen .quelle
Wenn der Host Windows 10 ist, verwenden Sie anstelle des Schrägstrichs den Schrägstrich -
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.
quelle
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
quelle
Update Juli 2015 - boot2docker unterstützt jetzt die direkte Montage. Sie können
-v /var/logs/on/host:/var/logs/in/container
direkt von Ihrer Mac-Eingabeaufforderung aus verwenden, ohne doppelt zu mountenquelle
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:Um es dann zu testen, können Sie es
echo TEST > hostTest.txt
in Ihrem Bild tun . Sie sollten diese neue Datei im lokalen Hostordner unter sehen könnenC:/Users/C/Desktop/dockerStorage/
.quelle
-v $(pwd):/var/xx
zuerst verwendet habe und das funktionierte, aber zu einem leeren Verzeichnis führte. Ich laufe Cyg via Babun.Ich habe das gleiche Problem gehabt. Meine Kommandozeile sah folgendermaßen aus:
Das Problem war mit 'pwd'. Also habe ich das in $ (pwd) geändert:
quelle
z
?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 versuchen
docker 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.
quelle
/c/projectpath
aber dann erhalte ich den Fehlerbind mount source path does not exist: /host_mnt/c/projectpath
.Ich fand heraus, dass ein Verzeichnis, das unter einer Systemanweisung wie
/var
liegt/usr
,/etc
nicht unter dem Container bereitgestellt werden konnte.Die Direktive sollte sich am Space
-v
Switch des Benutzers befinden. Der Docker-Daemon wird angewiesen, das lokale Verzeichnis in den Container zu mounten. Beispiel:quelle
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
quelle
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.
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.)
quelle
Hatte das gleiche Problem. Fand dies in der Docker-Dokumentation :
Das Mounten eines Lese- / Schreibhostverzeichnisses ist also nur mit dem
-v
Parameter imdocker run
Befehl möglich, wie die anderen Antworten richtig zeigen.quelle
Hier ist ein Beispiel mit einem Windows-Pfad:
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
AutoHotkey
Skript 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 Key
Taste, 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.
quelle
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
/data
im Container angehängt.quelle
Beachten Sie, dass Sie in Windows den absoluten Pfad angeben müssen.
Unten hat für mich gearbeitet.
quelle
Ich hatte die gleichen Probleme, ich habe versucht, C: \ Users \ Ordner auf Docker zu mounten.
So habe ich es gemacht Docker Toolbox Befehlszeile
quelle
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.
quelle
Sie können dies auch mit Portainer tun Webanwendung um eine andere visuelle Erfahrung .
Ziehen Sie zuerst das Portainer-Bild:
Erstellen Sie dann ein Volume für Portainer:
Erstellen Sie auch einen Portainer-Container:
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.
PS: Ich verwende Docker 19.035 und Portainer 1.23.1
quelle