HOWTO · Docker

Dateien vom Host in einen Docker-Container kopieren

Eine lokale Datei oder ein Verzeichnis mit docker cp in einen vorhandenen Container kopieren und COPY oder einen Bind-Mount für andere Anforderungen wählen.

Auf dieser Seite

Für eine einmalige Übertragung in einen vorhandenen Container verwenden Sie docker cp mit einer lokalen Quelle und einem Container-Ziel:

docker cp ./local-file CONTAINER:/existing-directory/

CONTAINER ist Name oder ID. docker cp funktioniert mit laufenden und gestoppten Containern. Lokale relative Pfade beziehen sich auf das aktuelle Verzeichnis; Containerpfade beginnen bei /, dessen erster Schrägstrich optional ist. Die Docker-Referenz zu cp beschreibt die vollständige Syntax.

Datei in einen vorhandenen Container kopieren

Dieses Beispiel kopiert hello.txt nach /opt/ eines Containers namens demo-app:

docker cp ./hello.txt demo-app:/opt/
docker exec demo-app ls -l /opt/hello.txt

/opt/ muss bereits existieren. Docker behält dann den Dateinamen, also entsteht /opt/hello.txt. Eine vorhandene Zieldatei wird überschrieben. docker exec prüft die Kopie, benötigt aber einen laufenden Container; docker cp selbst nicht.

Verzeichnis oder nur seinen Inhalt kopieren

Verzeichnisse werden rekursiv kopiert. Die Schreibweise der Quelle entscheidet, ob das Verzeichnis selbst oder nur sein Inhalt im Ziel landet:

# Erstellt host-files im Verzeichnis /opt/
docker cp ./host-files demo-app:/opt/

# Kopiert den Inhalt nach dem vorhandenen /opt/incoming/.
docker cp ./host-files/. demo-app:/opt/incoming/

Das zweite Ziel muss existieren. Ein Ziel mit abschließendem / muss ein vorhandenes Verzeichnis sein. Docker erstellt keine fehlenden Elternverzeichnisse. Bei einer Datei ohne abschließendes / darf ein nicht vorhandenes Ziel als neue Datei entstehen; ein Verzeichnis kann nicht auf eine Datei kopiert werden. Diese Fälle verhindern versehentlich verschachtelte Pfade oder Überschreiben.

docker cp, Dockerfile COPY oder Bind-Mount wählen

Bedarf Geeignete Methode
Jetzt eine Datei in diesen Container legen docker cp
Datei in jedes neu gebaute Image aufnehmen Dockerfile COPY
Host-Dateien während der Entwicklung live teilen Bind-Mount

COPY ./config.yaml /app/config.yaml ist eine Build-Anweisung. Die Quelle muss im Build-Kontext liegen und die Anweisung ändert keinen bereits vorhandenen Container. Ein Bind-Mount wird beim Start eingerichtet:

docker run --mount type=bind,source=/absolute/host/path,target=/app/input,readonly IMAGE

Ein Bind-Mount teilt Speicher, statt eine Kopie anzulegen. Ohne readonly kann der Containerprozess Host-Dateien ändern oder löschen. Lesen Sie ein Host-Verzeichnis in einen Docker-Container einhängen, wenn Live-Sharing die eigentliche Anforderung ist. docker cp schreibt nur in das beschreibbare Dateisystem dieses Containers: Nach Stop/Start desselben Containers bleibt die Datei, ein Ersatzcontainer aus dem Image erhält sie jedoch nicht.

Häufige Fehler vermeiden

Quellpfad und Ziel vor dem Kopieren prüfen. Ohne -a gehören Dateien im Container normalerweise root:root; -a erhält UID/GID der Quelle. Symlinks werden standardmäßig als Link kopiert, -L kopiert ihr Ziel. Bestimmte Systempfade wie /proc, /sys, /dev, temporäre Dateisysteme und benutzerdefinierte Mounts lassen sich nicht mit docker cp kopieren. Dafür nennt die Docker-Dokumentation eine tar-Alternative.