Wie man Dateien mit Docker cp in Ihren Docker-Container kopiert

Wenn Sie Dateien vom Docker-Host auf Ihren Docker-Container kopieren müssen, ist dieses Tutorial genau richtig.

In diesem Tutorial lernen Sie, wie Sie Dateien von Docker-Host zu einem Docker-Container mithilfe verschiedener Ansätze kopieren können.

Legen wir los!

Voraussetzungen

Wenn Sie Schritt für Schritt mitmachen möchten, stellen Sie sicher, dass Sie folgendes haben:

  • Docker installiert auf dem Linux-Host. Dieses Tutorial verwendet Docker v19.03.11. Sie können Ihre Docker-Version überprüfen, indem Sie docker version ausführen.

Kopieren von Dateien mit dem docker cp Befehl

Um dieses Tutorial zu beginnen, lernen Sie, wie Sie Dateien vom Docker-Host zu den Containern mithilfe des docker cp Befehls kopieren können. Der docker cp Befehl kopiert Dateien oder Verzeichnisse zwischen einem Container und dem lokalen Dateisystem Ihres Docker-Hosts und umgekehrt.

Lassen Sie uns lernen, wie Sie den Docker cp-Befehl mit einem Beispiel verwenden.

1. Öffnen Sie ein Terminal auf Ihrem lokalen Computer.

2. Erstellen Sie eine Datei mit dem Namen myfile.txt mit dem Befehl touch. Die Datei myfile.txt wird vom Docker-Host in den Container kopiert.

touch myfile.txt

3. Führen Sie den Befehl docker run aus. Der unten stehende docker run erstellt einen neuen Container im Hintergrund. Der Befehl enthält drei unten beschriebene Parameter:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx wird das Bild sein, das zum Ausführen des Containers verwendet wird.
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. Überprüfen Sie, ob der Docker-Container erfolgreich erstellt wurde, indem Sie den Befehl docker ps ausführen. Nach Ausführung des Befehls docker ps sollten Sie einen neuen Wert unter dem Attribut CONTAINER ID (in diesem Fall ccae4670f030) sehen, der mit dem NGINX-Bild bestätigt, dass der Container erfolgreich erstellt wurde.

sudo docker ps
Verifying the docker container by running the docker ps command

Vor Ausführung des Docker cp-Befehls lautet die Syntax des Befehls wie folgt:

  • CONTAINER: SRC_PATH gibt den Quellpfad des Containers an.
  • DEST_PATH ist der Ziel-Pfad auf dem Host.
  • CONTAINER: DEST_PATH ist der Ziel-Pfad im Container.

Zusätzlich können Sie dem Befehl auch die Optionen mit den unten stehenden Parametern hinzufügen.

  • Verwenden Sie Archiv oder a – Kopiert alle Benutzer- und Primärgruppenberechtigungen der Dateien und Ordner.
  • Verwendung von L – Durch Angabe der L-Option wird jedem symbolischen Link im Quellpfad ermöglicht, zum Zielortpfad kopiert zu werden.
# Syntax zum Kopieren vom Container zum Docker-Host
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# Syntax zum Kopieren vom Docker-Host zum Container
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. Führen Sie als Nächstes den Befehl docker cp aus. Der Befehl docker cp kopiert die myfile.txt, die Sie zuvor erstellt haben, in das Verzeichnis /usr/share des Containers. ccae4670f030 ist die Container-ID, zu der die myfile.txt kopiert wird.

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. Melden Sie sich schließlich über SSH beim ausgeführten Container an, indem Sie den Befehl docker exec mit /bin/bash ausführen, der als Standardschale für die Benutzeranmeldung des Linux-Systems verwendet wird.

  • Das Flag i gibt an, dass Sie eine interaktive SSH-Sitzung mit dem Container öffnen möchten. Das Flag i schließt die SSH-Sitzung nicht, auch wenn der Container nicht angehängt ist.
  • Das Flag t reserviert ein Pseudo-TTY, das zum interaktiven Ausführen von Befehlen verwendet werden muss.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

Sie sehen unten, dass Sie jetzt mit der Shell des Containers verbunden sind, wenn Sie docker exec ausführen.

SSH into the running container using docker exec command

7. Nach dem Einloggen in den Container überprüfen Sie, ob myfile.txt mithilfe des ls-Befehls in den Container kopiert wurde.

  • ls ist ein Befehl zum Auflisten von Computerdateien in Unix- und Unix-ähnlichen Betriebssystemen.
  • grep sucht nach allen Dateien oder Ordnern, die mit dem String my im Verzeichnis usr/share beginnen.
Verifying the files in the container

Kopieren von Dateien mit dem Dockerfile

In dem vorherigen Abschnitt haben Sie gelernt, wie man Dateien in den Container kopiert, indem man den Docker-Befehl cp ausführt. Was ist, wenn Sie mehrere Dateien auf einmal kopieren müssen? Sicherlich wird das Ausführen mehrerer Befehle zu einem Overhead! Um das Ausführen mehrerer cp-Befehle zu lösen, warum versuchen Sie nicht, Dateien oder Ordner in Container mit Dockerfile und COPY-Befehlen zu kopieren?

Das Bereitstellen eines Containers und das Kopieren der Dateien/Ordner mithilfe von Dockerfile ermöglicht es Ihnen, die manuellen Kopierschritte zu entfernen, die Sie im vorherigen Abschnitt durchgeführt haben. Ein Dockerfile ist ein Textdokument, das alle Befehle enthält, die ein Benutzer auf der Befehlszeile aufrufen könnte, um ein Abbild zusammenzustellen.

Erstellen wir ein Dockerfile, führen einen Container daraus aus und kopieren schließlich die Dateien.

1. Erstellen Sie einen Ordner mit dem Namen ~/host-to-container-copy-demo, und ändern Sie dann (cd) das Arbeitsverzeichnis zu diesem Ordner. Dieser Ordner enthält alle Dateien, die Sie in dieser Demo erstellen werden.

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. Erstellen Sie nun zwei Textdateien mit den Namen myfile1.txt und myfile2.txt, kopieren Sie sie und fügen Sie sie in die Dateien ein, und speichern Sie sie im Verzeichnis ~/host-to-container-copy-demo.

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. Erstellen Sie eine weitere Datei, kopieren/einfügen Sie die untenstehende Konfiguration und speichern Sie die Datei als Dockerfile im Verzeichnis ~/host-to-container-copy-demo. Wenn Sie fertig sind, verwendet Docker diese Dockerfile, um alle erforderlichen Befehle zum Erstellen eines neuen Docker-Images auf Basis eines beliebigen Basisimages auszuführen.

Die Dockerfile unten enthält verschiedene Schritte/Anweisungen, die den neuen Container erstellen werden:

  • FROM Die Anweisung FROM initialisiert einen neuen Build-Schritt und setzt das Basissystem für nachfolgende Anweisungen fest.
  • COPY Der COPY-Befehl kopiert eine Datei vom Hostrechner (Docker-Host) in den Container.
# Anweisung für das Dockerfile, um ein neues Image auf Basis des Basisimages (ubuntu) zu erstellen
# Verwendung des Basisimages ubuntu:latest
FROM ubuntu:latest
# Kopieren von myfile1.txt in das Verzeichnis /usr/share des Containers
COPY myfile1.txt /usr/share
# Kopieren von myfile2.txt in das Verzeichnis /tmp des Containers
COPY myfile2.txt /tmp

4. Überprüfen Sie alle erforderlichen Dateien zum Erstellen des neuen Images, indem Sie den Befehl tree ausführen. Sie sollten Dockerfile, myfile1.txt und myfile2.txt im Verzeichnis ~/host-to-container-copy-demo sehen.

Verifies files and folders using tree command

5. Bauen Sie das Image anschließend, indem Sie den Befehl docker build ausführen. Der t-Flag wird verwendet, um das Image updated_ubuntu_image mit dem latest zu taggen, und . erlaubt Docker, alle erforderlichen Dateien aus dem aktuellen Arbeitsverzeichnis auszuwählen.

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. Überprüfen Sie nun das neu erstellte Image updated_ubuntu_image, indem Sie den Befehl docker images ausführen. Beachten Sie das REPOSITORY-Attribut. Dieses Attribut ist der Tag, der mit dem -t-Flag im vorherigen Schritt erstellt wurde.

sudo docker images
Repository Attribute

7. Führen Sie abschließend den Docker-Container mithilfe des neu erstellten Images aus, indem Sie den Befehl docker run ausführen. Der -it-Flag weist Docker an, ein Pseudoterminal zuzuweisen, das mit der Standardeingabe des Containers verbunden ist. bash bietet die Standardshell für die Benutzeranmeldung des Linux-Systems.

sudo docker run -it updated_ubuntu_image bash

Sie werden unten sehen, dass Sie sich jetzt in der Bash-Shell des Docker-Containers befinden.

Running the container using docker run command.

8. Überprüfen Sie als nächstes, ob die Dateien erfolgreich in den Verzeichnissen /tmp und /usr/share auf dem Container kopiert wurden, indem Sie den Befehl ls ausführen.

Verifying the files if they are successfully copied on the container

Einhängen eines Speichervolumes und Zugriff auf Dateien mit dem Docker Volume-Befehl

Bis jetzt haben Sie gelernt, wie Sie Dateien vom Host zum Container mithilfe zweier unterschiedlicher Ansätze mit dem docker cp-Befehl und einem DockerFile kopieren. Dieses Mal lernen wir, wie Sie Dateisysteme zwischen Host und Containern mithilfe des docker volume-Befehls einfach freigeben.

Angenommen, Sie sind immer noch im Terminal angemeldet:

1. Erstellen Sie ein Volume auf dem Docker-Host, indem Sie den docker volume create-Befehl ausführen. Der folgende Befehl erstellt ein Volume mit dem Namen my-vol. sudo docker volume create my-vol

sudo docker volume create my-vol

2. Überprüfen Sie, ob das Volume erfolgreich erstellt wurde, indem Sie den docker volume ls-Befehl ausführen. Der Befehl docker volume ls listet das Volume auf. Nach Ausführung des Befehls docker volume ls sehen Sie my-vol im VOLUME NAME-Attribut, was bestätigt, dass das Volume erfolgreich erstellt wurde.

sudo docker volume ls
Listing the docker volumes

3. Führen Sie anschließend den Container mit dem docker run-Befehl aus.

  • Der Container mit dem Namen volume_testing verwendet das Image nginx:latest.
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. Überprüfen Sie, ob das zuvor erstellte Volume „my-vol“ ordnungsgemäß mit dem Container mithilfe des docker inspect-Befehls eingebunden ist. Der Docker Inspect-Befehl liefert Informationen zum Container. Nach Ausführung des docker inspect-Befehls werden alle Details des angegebenen Containers (volume_testing) angezeigt, einschließlich der Einhängepunktdetails, wie unten gezeigt.

sudo docker inspect volume_testing

Im Bild unten wird bestätigt, dass das Volume (my-vol), das zuvor auf dem Host erstellt wurde, erfolgreich mit dem Verzeichnis /app des Containers eingebunden ist.

Verifying the volumes in the container

Fazit

In diesem Tutorial haben Sie verschiedene Möglichkeiten gelernt, Dateien oder Ordner vom Docker-Host in Container zu kopieren, wie die Verwendung des Docker cp-Befehls, der Docker Volume-Befehle und des Dockerfiles.

Welchen Ansatz werden Sie als nächstes verwenden, um Daten vom Host zu Docker-Containern zu kopieren?

Source:
https://adamtheautomator.com/docker-cp/