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)?

708voto

nhjk Punkte 7702

Es gibt ein paar Möglichkeiten, dies zu tun. Der einfachste Weg, dies zu tun, besteht darin, das Dockerfile ADD -Befehl wie folgt zu verwenden:

ADD . /pfad/innerhalb/von/docker/container

Jedoch werden alle Änderungen an diesem Verzeichnis auf dem Host nach dem Erstellen des Dockerfiles nicht im Container angezeigt. Dies liegt daran, dass Docker beim Erstellen eines Containers das Verzeichnis in ein .tar komprimiert und diesen Kontext dauerhaft in den Container hochlädt.

Der zweite Weg, dies zu tun, ist der Weg, den Sie versucht haben, nämlich ein Volume zu mounten. Aufgrund des Versuchs, so portabel wie möglich zu sein, können Sie kein Host-Verzeichnis auf ein Container-Verzeichnis innerhalb eines Dockerfiles zuordnen, da sich das Host-Verzeichnis je nach der Maschine ändern kann, auf der Sie arbeiten. Um ein Host-Verzeichnis einem Docker-Container-Verzeichnis zuzuordnen, müssen Sie die -v -Flag verwenden, wenn Sie docker run verwenden, z.B.:

# Einen Container mit dem `alpine`-Image ausführen, das `/tmp`
# Verzeichnis von Ihrem Host in das `/container/verzeichnis`
# Verzeichnis in Ihrem Container mounten und den `ls` Befehl ausführen,
# um die Inhalte dieses Verzeichnisses anzuzeigen.
docker run \
    -v /tmp:/container/verzeichnis \
    alpine \
    ls /container/verzeichnis

280voto

Eduardo Santana Punkte 5251

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

Was Sie möchten, ist das lokale Verzeichnis innerhalb des Container-Verzeichnisses synchronisiert zu halten, dies wird durch das Einhängen des Volumes vom Typ Bind erreicht. Dadurch werden die Quelle (Ihr System) und die Ziel (im Docker-Container) Verzeichnisse verbunden. Es ist fast dasselbe wie das Einhängen eines Verzeichnisses unter Linux.

Laut der Docker-Dokumentation ist der geeignete Befehl zum Einhängen jetzt Mount anstelle von -v. Hier ist die Dokumentation dazu:

  • --mount: Besteht aus mehreren Schlüssel-Wert-Paaren, die durch Kommas getrennt sind. Jedes Schlüssel/Wert-Paar hat die Form eines =-Tupels. Die Syntax von --mount ist umfangreicher als -v oder --volume, aber die Reihenfolge der Schlüssel ist nicht signifikant und der Wert der Flagge ist leichter zu verstehen.

  • Der Typ des Einhängens, der Bind, Volume oder tmpfs sein kann. (Wir werden Bind verwenden)

  • Die Quelle des Einhängens. Für Bind-Einhängungen ist dies der Pfad zur Datei oder zum Verzeichnis auf dem Docker-Daemon-Host. Kann als Quelle oder src angegeben werden.

  • Das Ziel nimmt als Wert den Pfad an, an dem die Datei oder das Verzeichnis im Container eingehängt wird. Kann als Ziel, dst oder Ziel angegeben werden.

Also, um das aktuelle Verzeichnis (Quelle) mit /test_container (Ziel) einzuhängen, werden wir folgendes verwenden:

    docker run -it --mount src="$(pwd)",Ziel=/test_container,Typ=Bind k3_s3

Wenn diese Einhängeparameter Leerzeichen enthalten, müssen Sie Anführungszeichen um sie setzen. Wenn ich weiß, dass sie das nicht tun, würde ich stattdessen `pwd` verwenden:

    docker run -it --mount src=`pwd`,Ziel=/test_container,Typ=Bind k3_s3

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

140voto

rgaut Punkte 2779

Sie können die -v Option von der Befehlszeile aus verwenden, diese Funktion ist nicht über Dockerfile verfügbar

docker run -t -i -v :  ubuntu /bin/bash

wo host_dir das Verzeichnis vom Host ist, das Sie einbinden möchten. Sie müssen sich keine Sorgen um das Verzeichnis des Containers machen, falls es nicht existiert, wird Docker es erstellen.

Wenn Sie Änderungen in host_dir von der Host-Maschine aus vornehmen (unter Root-Berechtigung), werden sie für den Container sichtbar und umgekehrt.

90voto

louis V Punkte 901

2 aufeinander folgende Mounts: Ich vermute, dass viele Beiträge hier möglicherweise zwei Boot2docker verwenden, der Grund, warum Sie nichts sehen, liegt darin, dass Sie ein Verzeichnis von Boot2docker und nicht von Ihrem Host einhängen.

Sie benötigen im Grunde genommen 2 aufeinander folgende Mounts:

den ersten zum Einhängen eines Verzeichnisses von Ihrem Host in Ihr System

den zweiten, um das neue Verzeichnis von Boot2docker in Ihren Container einzuhängen, genau so:

  • 1) Mounten des lokalen Systems auf boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
  • 2) Mounten der boot2docker Datei auf den Linux-Container

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

Dann, wenn Sie in das containerfolder ls machen, sehen Sie den Inhalt Ihres hostfolder.

36voto

Miko Chu Punkte 707

Für diejenigen, die einen Ordner im aktuellen Verzeichnis einhängen möchten:

docker run -d --name some-container -v ${PWD}/folder:/var/folder ubuntu

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