Frage Kopieren von Dateien vom Host zum Docker-Container


Ich versuche, eine Sicherungs- und Wiederherstellungslösung für die Docker-Container zu erstellen, mit denen wir arbeiten.

Ich habe ein Docker-Basisbild, das ich erstellt habe, ubuntu:baseund nicht jedes Mal mit einer Docker-Datei neu erstellen müssen, um Dateien hinzuzufügen.

Ich möchte ein Skript erstellen, das von der Host-Maschine ausgeführt wird und einen neuen Container mit dem erstellen ubuntu:base Docker-Image und kopiert dann Dateien in diesen Container.

Wie kann ich Dateien vom Host in den Container kopieren?


875
2018-04-07 08:28


Ursprung


Antworten:


Das cp Befehl kann zum Kopieren von Dateien verwendet werden. Eine bestimmte Datei kann wie folgt kopiert werden:

docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt foo.txt

Mehrere Dateien, die im Ordner enthalten sind src kann in die kopiert werden target Ordner mit:

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

Referenz: Docker CLI-Dokumentation für cp 

In Docker-Versionen vor 1.8 war es nur möglich, Dateien von einem Container auf den Host zu kopieren. Nicht vom Host zu einem Container.


1515
2017-08-12 17:25



  1. Containername oder kurze Container-ID abrufen:

    $ docker ps
    
  2. Erhalten Sie die vollständige Container-ID:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Datei kopieren:

    $ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
    

BEISPIEL:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

oder

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

150
2017-07-17 14:01



Der sauberste Weg besteht darin, vor dem Ausführen des Befehls ein Hostverzeichnis auf dem Container bereitzustellen:

{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile

109
2017-08-12 21:28



Das Folgende ist eine ziemlich hässliche Art, es zu tun, aber es funktioniert.

docker run -i ubuntu /bin/bash -c 'cat > file' < file

101
2018-06-11 16:02



Wenn Sie dies für einen laufenden Container tun müssen, können Sie docker exec (hinzugefügt in 1.3) verwenden.

Suchen Sie zuerst nach dem Namen oder der ID des Containers:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                   NAMES
b9b7400ddd8f        ubuntu:latest                "/bin/bash"         2 seconds ago       Up 2 seconds                                elated_hodgkin

Im obigen Beispiel können wir entweder verwenden b9b7400ddd8f oder elated_hodgkin.

Wenn du alles reinkopieren wolltest /tmp/somefiles auf dem Host zu /var/www im Behälter:

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www

Wir können dann ausführen /bin/bash in den Container und verifizieren, dass es funktioniert hat:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2

37
2018-01-24 07:38



Die Lösung ist unten angegeben,

Aus der Docker-Shell

root@123abc:/root#  <-- get the container ID

Vom Gastgeber

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

Die Datei soll direkt an den Ort kopiert werden, an dem sich der Container im Dateisystem befindet.


32
2018-06-23 17:01



Eine andere Lösung zum Kopieren von Dateien in einen laufenden Container ist die Verwendung von tar:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

Kopiert die Datei foo.sh in /tmp des Behälters.

Bearbeiten: Entfernen Sie Redntant -f, Dank an Maartens Kommentar.


25
2018-04-21 13:50



Sehr leicht

  1. Erstellen Sie eine neue Dockerdatei und verwenden Sie das vorhandene Bild als Basis.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. Dann baue den Container:

    docker build .
    

20
2017-07-08 20:47



Um eine Datei zu kopieren vom Host zum laufenden Container

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

Beyogen auf Eriks Antwort und Mikls und z0rs Kommentare.


19
2017-07-01 09:09



Mit Docker 1.8, docker cp kann Dateien vom Host in den Container kopieren. Siehe den Docker Blogpost Ankündigung von Docker 1.8: Content Trust, Toolbox und Updates für Registrierung und Orchestrierung.


11
2017-08-12 17:22



Dies ist eine direkte Antwort auf die Frage "Dateien vom Host zum Docker-Container kopieren", die in dieser Frage im Titel angesprochen wurde.

Versuchen docker cp. Es ist der einfachste Weg dies zu tun und funktioniert sogar auf meinem Mac. Verwendung:

docker cp /root/some-file.txt some-docker-container:/root

Dies wird die Datei kopieren some-file.txt im Verzeichnis /root auf Ihrem Host-Computer in den Docker-Container namens some-docker-container in das Verzeichnis /root. Es ist sehr nah an der sicheren Kopie-Syntax. Und wie im vorherigen Beitrag gezeigt, können Sie es umgekehrt verwenden. Das heißt, Sie kopieren auch Dateien vom Container zum Host.

Und bevor Sie diesen Post downlink, bitte geben Sie ein docker cp --help. Das Lesen der Dokumentation kann sehr hilfreich sein, manchmal ...

Wenn Ihnen das nicht gefällt und Sie Datenvolumen in Ihrem bereits erstellten und laufenden Container haben wollen, dann ist Erholung heute die einzige Möglichkeit. Siehe auch Wie kann ich einem vorhandenen Docker-Container ein Volume hinzufügen?.


11
2017-09-23 13:18