Kopieren Dateien aus dem Docker-Container auf den Host

Isaac Tony 23 August 2022
  1. Mit docker cp Dateien vom Docker-Container auf den Host kopieren
  2. Verwendung von Docker-Mounts zum Kopieren von Dateien vom Docker-Container auf den Host
  3. Kopieren von Dateien vom Docker-Container zum Host mit COPY
Kopieren Dateien aus dem Docker-Container auf den Host

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.

Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

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.

LinkedIn

Verwandter Artikel - Docker Container