Kopieren Dateien aus dem Docker-Container auf den Host
-
Mit
docker cp
Dateien vom Docker-Container auf den Host kopieren - Verwendung von Docker-Mounts zum Kopieren von Dateien vom Docker-Container auf den Host
-
Kopieren von Dateien vom Docker-Container zum Host mit
COPY
Vor Docker 1.8 konnten wir nur Dateien aus dem Container auf den Host kopieren. Da Container jedoch immer beliebter wurden, wurde das Kopieren von Dateien in und aus Containern notwendig.
Einer der häufigsten Gründe, warum wir Dateien aus einem Docker-Container kopieren möchten, ist die gemeinsame Nutzung von Protokolldateien mit unseren Teammitgliedern. Das Kopieren sensibler Informationen wie Ressourcen unter /dev
, /proc
, /sys
, tmpfs
ist jedoch nicht erlaubt.
In diesem Artikel wird erläutert, wie Sie Dateien aus einem Docker-Container mithilfe einer Docker-Datei, dem Befehl docker cp
und dem Mounten von Verzeichnissen als Volumes auf dem Hostcomputer kopieren.
Dazu müssen Docker und ein Docker-Container korrekt installiert und konfiguriert werden. Dies funktioniert sowohl in Linux- als auch in WSL-Umgebungen.
Mit docker cp
Dateien vom Docker-Container auf den Host kopieren
Der Befehl docker cp
ist eine der einfachsten Möglichkeiten, Dateien und Verzeichnisse von unserem Host-Computer in einen Docker-Container zu kopieren. Wir werden Ubuntu 20.4.5 und die aktuellste Version von Docker verwenden, nämlich 19.03.
Syntax:
$ docker cp [OPTIONS] CONTAINER: SRC_PATH DEST_PATH|-
Woher:
SRC_PATH
gibt den Quellpfad an, wo sich die zu kopierende Datei auf dem Host befindet.DEST_PATH
ist der Zielpfad zum Speichern der Datei im Container.
Mit diesem Befehl können wir Dateien in und aus dem Container kopieren, indem wir die Parameter SRC_PATH
und DEST_PATH
vertauschen. Ein Vorteil dieses Befehls besteht darin, dass wir sowohl Dateien als auch Verzeichnisse in und aus laufenden oder gestoppten Containern kopieren können.
Der Befehl docker cp
ähnelt dem Befehl Unix cp -a
; Daher bedeutet dies, dass Verzeichnisse auch rekursiv kopiert werden. Darüber hinaus geht der Befehl davon aus, dass alle Pfade zum Container relativ zum Stammverzeichnis sind.
Wir beginnen damit, dass wir zuerst unseren Zielcontainer erstellen; Daher brauchen wir auch ein Bild. Wir verwenden das offizielle Ubuntu-Image, das in der Docker-Registrierung verfügbar ist.
$ docker pull ubuntu
Anschließend erstellen wir einen Docker-Container im getrennten und interaktiven Modus. Dadurch kann unser Container im Hintergrund ausgeführt werden.
$ docker run -it -d ubuntu
e10b4a7bbc59131d30492a87dd70b8ea74fa686ed5036ec918b6596fc83efe2b
Mit dem Befehl exec
führen wir eine interaktive SSH-Sitzung mit dem Befehl docker exec
und dem Flag -it
aus. Dadurch können wir Befehle interaktiv innerhalb des Containers ausführen.
Um eine einfache Textdatei zu erstellen, navigieren wir zum Ordner /usr/share
.
Wir beginnen mit dem Betreten des Containers mit der entsprechenden Container-ID.
$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/#
Wir navigieren zum Ordner /usr/share/
innerhalb des Containers, um unsere Textdatei zu erstellen.
$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/# cd usr
root@e10b4a7bbc59:/usr# cd share
root@e10b4a7bbc59:/usr/share#
Wir erstellen eine Datei mit dem Namen new_file.txt
mit dem Befehl touch
. Wir werden diese Datei in Kürze aus diesem Container auf unseren Host kopieren.
Daher ist es gut, sich das Verzeichnis zu merken, in dem die Datei gespeichert ist, da wir diesen Speicherort verwenden werden, wenn wir sie auf den Host kopieren.
root@e10b4a7bbc59:/usr/share# touch new_file.txt
Um zu überprüfen, ob wir die Datei erstellt haben, führen Sie den Befehl ls
aus, um alle Dateien in diesem Verzeichnis aufzulisten, wie unten gezeigt.
root@e10b4a7bbc59:/usr/share# ls
adduser bash-completion debianutils dpkg keyrings man pam polkit-1
apport bug dict gcc libc-bin menu pam-configs sensible-utils
base-files common-licenses doc gdb lintian misc perl5 tabset
base-passwd debconf doc-base info locale new_file.txt pixmaps terminfo
Nachdem wir nun erfolgreich eine Datei in unserem Container erstellt haben, wollen wir diese Datei aus diesem Container auf unseren Host kopieren – verlassen Sie den Container mit dem Befehl exit
in die Haupt-Shell.
Wir führen den Befehl docker cp
im Terminal aus und kopieren die new_file.txt
in ein Verzeichnis auf dem Hostcomputer. Zunächst müssen wir jedoch drei wichtige Dinge beachten:
- Die Container-ID;
- Der Speicherort der Zieldatei im Container;
- Das Zielverzeichnis auf dem Hostcomputer, in das wir die Datei kopieren.
$ docker cp e10b4a7bbc59:/usr/share/new_file.txt ./new_file.txt
Wir haben die new._file.txt
erfolgreich auf den Host-Computer kopiert, indem wir diesen Befehl ausgeführt haben. Wir können dies überprüfen, indem wir den Befehl ls
in diesem bestimmten Ordner ausführen.
isaac@DESKTOP-HV44HT6:~/isaac$ ls
adduser bash-completion debianutils dpkg keyrings man `new_file.txt` pixmaps terminfo
apport bug dict gcc libc-bin menu pam polkit-1
base-files common-licenses doc gdb lintian misc pam-configs sensible-utils
base-passwd debconf doc-base info locale my-app perl5 tabset
Verwendung von Docker-Mounts zum Kopieren von Dateien vom Docker-Container auf den Host
Wir können Docker-Mounts auch verwenden, um Dateien vom Docker-Container auf den Host zu kopieren.
Bind-Mounts sind eine der frühesten Lösungen, die es uns ermöglichen, Daten zu speichern, indem wir unsere Docker-Container in Verzeichnisse auf unserem Hostsystem mounten.
Bind-Mounts ermöglichen es uns, auf ein genaues Verzeichnis zu verweisen, indem wir uns auf den absoluten Dateipfad des Zielverzeichnisses beziehen. Neben dem Kopieren von Dateien aus dem Container auf den Host können wir auch Dienste erstellen, die von Verzeichnissen auf dem Hostsystem abhängen.
Um einen Docker-Mount zu erstellen, können wir beim Erstellen des Docker-Containers entweder das Flag -v
oder --mount
verwenden. Zusätzlich zu diesem Flag geben wir auch das Verzeichnis auf dem Hostcomputer an, das wir einem Verzeichnis im Docker-Container zuordnen möchten.
Diese Methode wird oft bevorzugt, da wir mehrere Mounts in einem Docker-Container erstellen können. Wir können auch Verzeichnisse erstellen, um Dateien aus mehreren Containern zu übertragen.
Um unser Verzeichnis in den Docker-Container zu mounten, müssen wir die folgenden Felder angeben, die immer in der richtigen Reihenfolge durch einen Doppelpunkt getrennt sein sollten. Diese beinhalten:
- Der Pfad zum Verzeichnis auf dem Host-Rechner, den wir mounten möchten;
- Der Pfad zu dem Verzeichnis im Container, wo wir dieses Verzeichnis mounten sollen;
- Andere optionale Optionen wie
ro
spezifizieren den Nur-Lesen-Modus.
Syntax:
docker run -t -i -v <host_dir>:<container_dir
Im folgenden Beispiel verwenden wir die offiziellen Ruby-Images, um einen Container zu erstellen und ein lokales Verzeichnis in ein Verzeichnis im Container einzuhängen. Sobald dies erledigt ist, können wir problemlos Dateien aus dem Container in das lokale Verzeichnis kopieren und umgekehrt.
$ docker run -it -v $HOME/Desktop/new_container:/new_container --name new_container ruby bash
root@7a00af9d4d96:/#
Wir können eine Datei einfach zwischen unserem Docker-Container und dem Host-Verzeichnis kopieren. Beachten Sie außerdem, dass im Hostverzeichnis erstellte Dateien automatisch im Docker-Containerverzeichnis verfügbar sind, das auf dem Host bereitgestellt wird.
Kopieren von Dateien vom Docker-Container zum Host mit COPY
Beim Erstellen eines Docker-Images mit einer Docker-Datei können wir mit dem Befehl KOPIEREN
auch Dateien zwischen dem Docker-Host und dem Container kopieren.
Syntax:
COPY <SRC> <DEST>
Im DockerFile unten haben wir als Quellverzeichnis ./app.py
und als Zielverzeichnis /var/www/app.py
angegeben.
# base image
FROM python
# Set your working directory
WORKDIR /var/www/
# Copy the necessary filesls
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt
# Install the necessary packages
RUN pip install -r /var/www/requirements.txt
# Run the app
ENTRYPOINT ["echo", "Hello, Developer"]
Dieses DockerFile erstellt ein Image einer einfachen Flask-Anwendung, die eine Nachricht auf der Konsole ausgibt.
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedInVerwandter Artikel - Docker Container
- Der Unterschied zwischen Docker-Container und Docker-Image
- Erstellen Sie einen Container in einer Docker-Compose-Datei neu
- Führen Sie Container mit Docker kontinuierlich im Hintergrund aus
- Geben Sie einen laufenden Docker-Container mit einem neuen Pseudo-TTY ein
- Listen Sie nur die angehaltenen Container in Docker auf
- Löschen Sie Container dauerhaft in Docker