HOWTO · Docker

Ein Host-Verzeichnis in einen Docker-Container einbinden

So stellen Sie ein Host-Verzeichnis in einem Docker-Container bereit und machen Dateien vom Host darin sichtbar.

Auf dieser Seite

Ein Bind-Mount verbindet ein Verzeichnis auf dem Host mit einem Pfad in einem Docker-Container. Verwenden Sie ihn, wenn ein Container Dateien aus einem bestimmten Host-Verzeichnis lesen oder dort ändern soll, zum Beispiel während der Entwicklung auf den Quellcode. Das folgende Beispiel legt ein Host-Verzeichnis und eine Datei darin an; die Docker-Befehle zeigen, wie Sie dieses Verzeichnis in einer Alpine-Shell bereitstellen. Die Docker-Befehle dienen der Veranschaulichung und wurden während der Erstellung dieses Artikels nicht ausgeführt.

Verwenden von Bind-Mounts zum Einbinden des Host-Verzeichnisses in einen Docker-Container

Ein Bind-Mount stellt den von Ihnen gewählten Host-Pfad unter einem Pfad im Container bereit. Anders als bei einem von Docker verwalteten Volume liegt die Quelle an einem bestimmten Ort auf dem Host. Änderungen an Dateien in diesem Verzeichnis sind über den Mount-Punkt im Container sichtbar. Eine Anwendung kann diese Änderungen sehen; ein automatisches Neuladen erfolgt jedoch nur, wenn die Anwendung ihre Dateien überwacht oder selbst neu lädt.

Ein Host-Verzeichnis mit -v oder --volume einbinden

Dieses Python-Beispiel erstellt ein Host-Verzeichnis namens site, schreibt eine Datei hinein und gibt den Dateinamen aus. Führen Sie es in dem Verzeichnis aus, von dem aus Sie Docker starten möchten:

from pathlib import Path

site = Path("site")
site.mkdir(exist_ok=True)
(site / "hello.txt").write_text("Hello from the host.\n")
print("\n".join(sorted(path.name for path in site.iterdir())))
hello.txt

Die Datei auf dem Host kann unter /site in einem Container geprüft werden, den Sie mit docker run --rm -it --volume "$PWD/site:/site" alpine:3.20 sh starten. Der Wert für das Volume hat die Form Host-Pfad:Container-Pfad[:Optionen]: $PWD/site ist das Host-Verzeichnis, /site sein Einhängeort im Container. Mit dem optionalen Suffix ro wird der Mount schreibgeschützt. Das kurze Flag -v und das lange Flag --volume verwenden dieselbe Syntax. Daher ist -v "$PWD/site:/site:ro" die schreibgeschützte Variante.

Während die Shell im Container läuft, können Sie auf dem Host mit touch "$PWD/site/host-change.txt" eine neue Datei erstellen. Prüfen Sie an der Eingabeaufforderung des Containers mit ls /site/host-change.txt, ob diese Datei über den Mount sichtbar ist. Bei einem beschreibbaren Mount werden Dateien, die unter /site erstellt werden, ebenfalls im Host-Verzeichnis angelegt. Bei einem schreibgeschützten Mount kann der Container die Dateien lesen, sie über diesen Mount aber nicht ändern.

Die Formen -v und --volume legen ein fehlendes Host-Verzeichnis als Verzeichnis an. Prüfen Sie den resultierenden Host-Pfad, bevor Sie den Container verwenden: Ein Tippfehler kann ein neues, leeres Verzeichnis erzeugen, sodass die erwarteten Dateien scheinbar fehlen.

Ein Host-Verzeichnis mit --mount einbinden

Bei der Form --mount wird jede Einstellung als kommagetrenntes Schlüssel-Wert-Paar angegeben. Für dasselbe Beispiel führen Sie docker run --rm -it --mount "type=bind,source=$PWD/site,target=/site" alpine:3.20 sh aus. type=bind wählt einen Bind-Mount, source bezeichnet das Host-Verzeichnis und target dessen Pfad im Container. Fügen Sie den Mount-Feldern readonly hinzu, um Schreibzugriffe zu verhindern. Die Reihenfolge der Felder legt nicht fest, welcher Pfad Quelle oder Ziel ist; dafür sind die Schlüssel maßgeblich.

Anders als -v und --volume meldet --mount einen Fehler, wenn die Quelle des Bind-Mounts nicht existiert. Legen Sie das Host-Verzeichnis an und prüfen Sie es, bevor Sie den Container starten. Bei Pfaden mit Kommas ist besondere Sorgfalt mit der kommagetrennten Mount-Syntax nötig. Wählen Sie einen geeigneten Host-Pfad oder beachten Sie die Mount-Syntax für Ihre Plattform.

Ein Bind-Mount gibt dem Container Zugriff auf den ausgewählten Host-Pfad. Binden Sie nur Verzeichnisse ein, die der Container tatsächlich benötigt, vermeiden Sie die Freigabe vertraulicher Dateien und verwenden Sie Schreibschutz, wenn der Container nichts ändern muss. Auch die Freigabe von Host-Pfaden und Berechtigungen können davon abhängen, wie Docker auf Ihrem System eingerichtet ist.

Fazit

Verwenden Sie -v oder --volume für die kompakte, durch Doppelpunkte getrennte Schreibweise oder --mount für ausdrücklich benannte Schlüssel-Wert-Felder. Beide stellen ein Host-Verzeichnis unter einem Pfad im Container bereit. -v kann ein fehlendes Quellverzeichnis anlegen, während die Quelle für --mount bereits existieren muss. Wählen Sie einen Bind-Mount, wenn der Container einen bestimmten Host-Pfad benötigt. Ein von Docker verwaltetes Volume eignet sich häufig besser für Anwendungsdaten, die Docker unabhängig von einem bestimmten Host-Verzeichnis verwalten soll.