Dateien vom Host in den Docker-Container kopieren

Isaac Tony 21 Mai 2022
  1. Verwenden Sie docker cp, um Dateien vom Host in den Docker-Container zu kopieren
  2. Verwenden Sie docker volume, um Dateien vom Host in den Docker-Container zu kopieren
Dateien vom Host in den Docker-Container kopieren

In diesem Artikel werden die Methoden erläutert und demonstriert, mit denen wir Dateien von unserem Hostcomputer in einen laufenden Container in Docker übertragen können.

Verwenden Sie docker cp, um Dateien vom Host in den Docker-Container zu 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 zu diesem Zeitpunkt neueste Version von Docker verwenden, nämlich v 19.03.

Syntax:

docker cp {options} PATH_HOST CONTAINER:PATH_TO_CONTAINER 

Woher:

  • PATH_HOST gibt den Quellpfad an, wo sich die zu kopierende Datei auf dem Host befindet.
  • PATH_TO_CONTAINER ist der Zielpfad, in dem wir die Datei im Container speichern möchten.

Beispiel:

Wir beginnen mit der Erstellung unseres Zielcontainers. Wir verwenden das offizielle Nginx-Image für diesen Artikel, das wir über den Docker-Desktop oder das Terminal abrufen können, indem wir den folgenden Befehl ausführen.

$ docker pull nginx

Ausgabe:

Using default tag: latest
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

Wir verwenden den folgenden Befehl, um zu überprüfen, ob wir das Image erfolgreich aus der Registrierung gezogen haben.

$ docker images

Ausgabe:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    c316d5a335a5   2 weeks ago   142MB

Wir können jetzt einen Container erstellen. Mit dem Befehl run erstellen wir einen Container und stellen ihn im getrennten Modus bereit, um den externen Port 8080 und den internen Port 80 abzuhören.

Der folgende Befehl erstellt einen Container mit dem Nginx-Basisimage.

$ docker run -d -p 8080:80 nginx

Wir können überprüfen, ob wir erfolgreich einen neuen Container erstellt haben, indem wir den Befehl docker ps -a ausführen. Dies listet alle Container auf, die wir kürzlich und in der Vergangenheit erstellt haben, zusammen mit ihren Container-IDs und den entsprechenden Bildern.

Wir können dies wie hier gezeigt ausführen.

docker ps -a

Ausgabe:

CONTAINER ID   IMAGE   COMMAND                  CREATED              STATUS              PORTS                  NAMES
0c57de10362b   nginx   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   lucid_booth

Bevor wir den Befehl docker cp verwenden, müssen wir eine Datei erstellen, die wir vom Host in den gerade erstellten Container kopieren.

Wir erstellen eine Datei mit dem Namen new_file.txt und speichern sie mit dem Befehl touch im Home-Verzeichnis.

Hier ist der Befehl dazu.

$ touch new_file.txt

Wir können das Verzeichnis anzeigen, um sicherzustellen, dass wir die Datei erfolgreich erstellt haben, indem wir den Befehl ls verwenden, wie hier gezeigt.

isaac@DESKTOP-HV44HT6:~$ ls
new_file.txt

new_file.txt ist natürlich eine leere Datei; Wir möchten uns jedoch darauf konzentrieren, den Befehl docker cp zu verwenden, um ihn vom Host in den Container zu verschieben, den wir zuvor erstellt haben.

Diese Datei kopieren wir dann in den von uns erstellten Container.

$ docker cp new_file.txt 0c57de10362b:/usr/share

Einfach so haben wir new_file.txt in den Container mit der ID 0c57de10362b unter den Ordner /usr/share kopiert.

Wir können dies feststellen, indem wir über eine interaktive SSH-Sitzung mit dem Befehl docker exec und dem Flag -it in den laufenden Container gelangen, um Befehle interaktiv auszuführen.

$ docker exec -it 0c57de10362b /bin/bash

Nachdem wir uns beim Container angemeldet haben, möchten wir Dateien auflisten, um zu überprüfen, ob wir diese Datei in diesen Container kopiert haben. Wir können den Befehl ls erneut verwenden, aber den Ordner angeben, auf den wir zugreifen möchten.

root@0c57de10362b:/# ls -lh /usr/share/

Ausgabe:

Anzeigen einer Datei, die vom Host in den Docker-Container kopiert wurde

In ähnlicher Weise können wir auch ein Verzeichnis kopieren, das viele Dateien enthält, indem wir einfach den Speicherort der Dateien ändern, die aus dem Verzeichnis gelesen werden sollen, wie unten gezeigt.

$ docker cp src/directory/. container-id:/target_location/directory

Der Befehl docker cp ist zwar einfach zu verwenden, weist jedoch einige Einschränkungen auf. Seine Syntax unterscheidet sich vom Unix-Befehl cp und unterstützt nur eine begrenzte Anzahl von Tags.

Außerdem kann dies nur zum Kopieren von Dateien vom Host in einen Container und nicht zwischen Containern verwendet werden.

Verwenden Sie docker volume, um Dateien vom Host in den Docker-Container zu kopieren

Ein besserer Ansatz zum Kopieren von Dateien zwischen Containern ist das docker volume.

Wir können Volumes anhängen, die Dateien enthalten, die wir während des Containererstellungsprozesses in einen Container kopieren möchten, indem wir eines der beiden Flags -v oder -mount verwenden.

Um Volumes in Docker zu verwenden, erstellen wir zunächst eines mit dem Befehl docker volume, wie unten gezeigt.

$ docker volume create volume_one

Mit docker volume ls können wir überprüfen, ob wir das Volume erfolgreich erstellt haben. Dies listet die Namen der Volumes auf, die jetzt und in der Vergangenheit erstellt wurden, sowie den Namen des Treibers.

isaac@DESKTOP-HV44HT6:~$ docker volume ls
DRIVER    VOLUME NAME
local     volume_one

Nachdem wir nun ein Volume erstellt haben, besteht der nächste Schritt darin, einen neuen Container mit dem Befehl run zu erstellen und das erstellte Volume mit dem Flag -v anzuhängen.

Das Flag -v ermöglicht es uns, das neue Volume an den von uns erstellten Container anzuhängen. Wir werden diesen Container mit der neuesten Version des Nginx-Basisimages erstellen.

$ docker run -d -v volume_one:/app nginx:latest
f2457d3eb8fe14645b9e3938017c02c46a657c9ad3323ff4c03924d2fddd7046

Mit dem Befehl Docker inspect können wir Low-Level-Informationen zu Docker-Objekten zurückgeben. Wir werden untersuchen, ob unser Volume erfolgreich an den von uns erstellten Container angehängt wurde.

Da wir diesem Container keinen Namen gegeben haben, verwenden wir die Container-ID, um ihn zu inspizieren. Wir verwenden die neueste Container-ID und nicht die frühere.

$ docker ps -a

Ausgabe:

CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                  NAMES
f2457d3eb8fe   nginx:latest   "/docker-entrypoint.…"   4 minutes ago       Up 4 minutes       80/tcp                 brave_kirch
0c57de10362b   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8080->80/tcp   lucid_booth

Wir können nun diese Container-ID verwenden, um den Container zu inspizieren.

$ docker inspect f2457d3eb8fe

Ausgabe:

Überprüfen eines bereitgestellten Volumes in einem Docker-Container

Einer der Vorteile des Befehls docker volume ist das Erstellen eines einzelnen Verzeichnisses, das von mehreren Containern gemeinsam genutzt wird.

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