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.