Jak skopiować pliki z hosta do kontenera Docker?

Próbuję zbudować rozwiązanie do tworzenia kopii zapasowych i przywracania kontenerów Docker, z którymi pracujemy.

Mam utworzony obraz bazowy Dockera, ubuntu:base i nie chcę go za każdym razem przebudowywać za pomocą pliku Dockera, aby dodać do niego pliki.

Chcę utworzyć skrypt, który uruchomi się z komputera hosta i utworzy nowy kontener za pomocą obrazu dokera ubuntu:base, a następnie skopiuje pliki do tego kontenera.

Jak mogę skopiować pliki z hosta na kontener?

Author: Flip, 2014-04-07

30 answers

Polecenie cp może być używane do kopiowania plików.

Jeden konkretny plik może być skopiowany do kontenera jak:

docker cp foo.txt mycontainer:/foo.txt

Jeden konkretny plik może być skopiowany z kontenera jak:

docker cp mycontainer:/foo.txt foo.txt

Dla podkreślenia, mycontainer jest kontenerem ID, Nie An obraz ID.

Wiele plików zawartych w folderze src można skopiować do folderu target za pomocą:

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

Reference: Docker CLI docs for cp

W Docker wersje wcześniejsze niż 1.8 możliwe było jedynie kopiowanie plików z kontenera do hosta. Nie od gospodarza do kontenera.

 3030
Author: 0x7d7b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-19 08:25:29
  1. Pobierz nazwę kontenera lub krótki identyfikator kontenera:

    $ docker ps
    
  2. Get full container id:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Skopiuj plik:

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

Przykład:

$ 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

Lub

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

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
 192
Author: solidleon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 10:29:07

Najczystszym sposobem jest zamontowanie katalogu hosta na kontenerze podczas uruchamiania kontenera:

{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
 151
Author: Ben Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 09:20:25

Poniższy sposób jest dość brzydki, ale działa.

docker run -i ubuntu /bin/bash -c 'cat > file' < file
 117
Author: Erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-11 16:22:18

Jeśli chcesz to zrobić na uruchomionym kontenerze, możesz użyć Docker exec (dodanego w 1.3).

Najpierw znajdź nazwę lub ID kontenera:

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

W powyższym przykładzie możemy użyć b9b7400ddd8f lub elated_hodgkin.

Jeśli chcesz skopiować wszystko w /tmp/somefiles na hoście do /var/www w kontenerze:

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

Możemy następnie exec /bin/bash w kontenerze i sprawdzić, czy działa:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2
 44
Author: adean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-24 07:38:07
  1. Utwórz nowy plik dockerfile i Użyj istniejącego obrazu jako bazy.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. Następnie zbuduj kontener:

    docker build .
    
 42
Author: RustyShackleford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-16 17:59:42

Roztwór podano poniżej,

Z powłoki Dockera,

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

From the host

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

plik jest kopiowany bezpośrednio do miejsca, w którym kontener znajduje się na systemie plików.

 41
Author: pierce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 12:52:43

Zazwyczaj są trzy typy:

  1. Z kontenera do hosta

    docker cp container_id:./bar/foo.txt .
    

dev1

  1. Z hosta do kontenera

    docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    
  2. Drugie podejście do kopiowania z hosta do kontenera:

    docker cp foo.txt mycontainer:/foo.txt
    

dev2

  1. From a container to a container mixes 1 and 2

    docker cp container_id1:./bar/foo.txt .
    
    docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    

dev3

 38
Author: Ali Hallaji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-10 18:07:53

Innym rozwiązaniem do kopiowania plików do działającego kontenera jest użycie tar:

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

Kopiuje plik foo.sh do /tmp kontenera.

Edit: Remove reduntant -f, thanks to Maarten s comment.

 32
Author: joemat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:54

Aby skopiować plik z hosta do uruchomionego kontenera

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

na podstawie odpowiedzi Erika oraz komentarzy Mikla i z0r.

 24
Author: Andrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:19

Jest to bezpośrednia odpowiedź na pytanie "kopiowanie plików z hosta do kontenera Dockera" postawione w tym pytaniu w tytule.

Spróbuj docker cp. Jest to najprostszy sposób, aby to zrobić i działa nawet na moim komputerze Mac. Sposób użycia:

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

Spowoduje to skopiowanie pliku some-file.txt z katalogu /root na komputerze hosta do kontenera dokera o nazwie some-docker-container do katalogu /root. Jest bardzo zbliżona do składni secure copy. I jak pokazano w poprzednim poście, można go używać na odwrót. Tzn. Ty również Kopiuj pliki z kontenera do hosta.

I zanim podlinkujesz ten post, wpisz docker cp --help. Czytanie dokumentacji może być czasem bardzo pomocne...

Jeśli nie podoba Ci się ten sposób i chcesz mieć wolumeny danych w już utworzonym i uruchomionym kontenerze, to rekreacja jest twoją jedyną opcją. Jak dodać wolumin do istniejącego kontenera dokującego?.

 20
Author: Hiro.Protagonist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:54

Próbowałem większości (upvoted) rozwiązań tutaj, ale w docker 17.09 (w 2018) nie ma już folderu /var/lib/Docker/aufs.

To proste docker cp rozwiązało to zadanie.

docker cp c:\path\to\local\file container_name:/path/to/target/dir/

Jak uzyskać nazwę kontenera?

 docker ps 

Jest NAMES sekcja. Nie używaj IMAGE.

 18
Author: Aerin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-12 19:49:13

Z Docker 1.8, {[0] } jest w stanie kopiować pliki z hosta do kontenera. Zobacz wpis na blogu Dockerzapowiedź Docker 1.8: content Trust, Toolbox, and Updates to Registry and Orchestration.

 15
Author: joemat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 10:35:49

Aby skopiować pliki / foldery pomiędzy kontenerem a lokalnym systemem plików, wpisz polecenie:

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

Na przykład,

docker cp /home/foo container-id:/home/dir

Aby uzyskać identyfikator contianera, wpisz podane polecenie:

docker ps

Powyższa treść pochodzi z docker.com .

 13
Author: prayagupd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 15:29:36

Zakładając, że kontener jest już uruchomiony, wpisz podane polecenie:

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

Aby udostępnić pliki za pomocą katalogu współdzielonego, Uruchom kontener, wpisując podaną komendę:

# docker run -v /path/to/host/dir:/path/to/container/dir ...

Uwaga: mogą pojawić się problemy z uprawnieniami, ponieważ użytkownicy kontenera nie są tacy sami jak użytkownicy hosta.

 8
Author: johndodo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 14:46:26

Jest to polecenie kopiowania danych z Dockera do hosta:

docker cp container_id:file path/filename /hostpath

docker cp a13fb9c9e674:/tmp/dgController.log /tmp/

Poniżej znajduje się polecenie kopiowania danych z hosta do Dockera:

docker cp a.txt ccfbeb35116b:/home/
 8
Author: Maninder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-28 12:23:21

W środowisku docker wszystkie kontenery znajdują się w katalogu:

/var/lib/docker/aufs/required-docker-id/

Aby skopiować katalog / plik źródłowy do dowolnej części kontenera, wpisz podane polecenie:

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/

 7
Author: 0x3bfc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 14:30:55

Docker CP command to przydatne narzędzie, które pozwala na kopiowanie plików i folderów pomiędzy kontenerem a systemem hosta.

Jeśli chcesz skopiować pliki z systemu hosta do kontenera, powinieneś użyć polecenia docker cp w następujący sposób:

docker cp host_source_path container:destination_path

Lista uruchomionych kontenerów najpierw za pomocą polecenia docker ps:

abhishek@linuxhandbook:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              
  PORTS               NAMES
  8353c6f43fba        775349758637        "bash"              8 seconds ago       Up 7 
  seconds                            ubu_container

Musisz znać identyfikator kontenera lub nazwę kontenera. W moim przypadku nazwa kontenera Dockera to ubu_container. a identyfikator kontenera to 8353c6f43fba.

Jeśli chcesz sprawdzić, czy pliki zostały skopiowane, możesz wprowadzić kontener w następujący sposób, a następnie użyć zwykłych poleceń Linuksa:

docker exec -it ubu_container bash

Kopiowanie plików z systemu hosta do kontenera dokera Kopiowanie za pomocą Docker cp jest podobne do polecenia copy w Linuksie.

Skopiuję plik o nazwie a.py do katalogu home / dir1 w kontenerze.

docker cp a.py ubu_container:/home/dir1

Jeśli plik zostanie pomyślnie skopiowany, nie będzie widać żadnych wyników na ekranie. Jeśli ścieżka docelowa nie istnieje, zobaczysz błąd:

abhishek@linuxhandbook:~$ sudo docker cp a.txt ubu_container:/home/dir2/subsub
        Error: No such container:path: ubu_container:/home/dir2

Jeśli plik docelowy już istnieje, zostanie nadpisany bez żadnego ostrzeżenia.

Możesz również użyć identyfikatora kontenera zamiast nazwy kontenera:

docker cp a.py 8353c6f43fba:/home/dir1
 7
Author: Abhishek Patwa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 10:54:56

tar i docker cp są dobrym combo do kopiowania wszystkiego w katalogu.

Tworzenie pojemnika objętości danych

docker create --name dvc --volume /path/on/container cirros

Aby zachować hierarchię katalogów

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

Sprawdź swoją pracę

docker run --rm --volumes-from dvc cirros ls -al /path/on/container
 5
Author: Everett Toews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 18:39:50

Jeśli hostem jest CentOS lub Fedora, nie ma proxy w /var/lib/docker/aufs, ale jest pod /proc:

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root

Ten cmd skopiuje całą zawartość katalogu data do / kontenera o id "containerid".

 5
Author: Abdennour TOUMI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 10:38:58

W przypadku, gdy nie jest jasne dla kogoś takiego jak ja, co mycontainer w odpowiedzi @h3nrik oznacza, w rzeczywistości jest to identyfikator kontenera. Aby skopiować plik WarpSquare.mp4 w /app/example_scenes/1440p60 z zakończonego kontenera dokera do bieżącego folderu użyłem tego.

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

Gdzie docker ps -q -l pobiera identyfikator kontenera ostatniej zakończonej instancji. Jeśli nie jest to zamknięty kontener, możesz go uzyskać przez docker container ls lub docker ps

 5
Author: ishandutta2007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 06:49:14

Składnia Kontenera:

docker run -v /HOST/folder:/Container/floder 

W pliku docker

COPY hom* /myFolder/        # adds all files starting with "hom"
COPY hom?.txt /myFolder/    # ? is replaced with any single character, e.g., "home.txt"
 5
Author: Isura Nimalasiri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 10:55:12

Wiele osób, które znajdą to pytanie, może mieć problem z kopiowaniem plików do obrazu dokera podczas jego tworzenia (zrobiłem).

W takim przypadku możesz użyć polecenia COPY w Dockerfile, którego używasz do tworzenia obrazu.

Zobacz dokumentację .

 4
Author: Klas Mellbourn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 10:33:34

Możesz po prostu śledzić adres IP swojej lokalnej maszyny za pomocą

ifconfig

Następnie wystarczy wejść do kontenera Dockera i wpisać

scp user_name@ip_address:/path_to_the_file destination

W każdym przypadku, jeśli nie masz zainstalowanego klienta i serwera SSH, po prostu zainstaluj go za pomocą:

sudo apt-get install openssh-server
 4
Author: Harshit Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 10:34:42

Jest to program do kopiowania pojedynczego pliku podczas uruchamiania kontenera tomcat.

docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

Spowoduje to skopiowanie pliku wojny do katalogu webapps i uruchomienie aplikacji w mgnieniu oka.

 4
Author: karthik101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 12:53:05
docker cp SRC_PATH CONTAINER_ID:DEST_PATH

Na przykład chcę skopiować mój plik xxxx / download / jenkins do tomcat

Zaczynam pobierać identyfikator kontenera Tomcat

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage

docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/
 4
Author: Mourad MAMASSI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-03 17:08:24

Najlepszym sposobem na skopiowanie plików do znalezionego przeze mnie kontenera jest zamontowanie katalogu na hoście za pomocą opcji -v polecenia docker run.

 3
Author: Prakash Varandani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-22 15:04:49

Są dobre odpowiedzi, ale zbyt konkretne. Dowiedziałem się, że {[2] } jest dobrym sposobem na uzyskanie identyfikatora kontenera, który Cię interesuje. Następnie wykonaj

mount | grep <id>

Aby zobaczyć, gdzie wolumin jest zamontowany. To

/var/lib/docker/devicemapper/mnt/<id>/rootfs/

Dla mnie, ale może to być inna ścieżka w zależności od systemu operacyjnego i konfiguracji. Teraz po prostu skopiuj pliki do tej ścieżki.

Używanie -v nie zawsze jest praktyczne.

 3
Author: akostadinov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 10:31:47

Właśnie zacząłem używać Dockera do kompilacji VLC, oto co możesz zrobić, aby skopiować pliki tam i z powrotem z kontenerów:

su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt

Wyszukaj znajomy plik w tym txt i będziesz miał folder, cd do niego jako root i voila! Kopiuj ile chcesz.

Może być ścieżka z "scalone" w nim, myślę, że chcesz tę z "diff" w nim.

Również jeśli opuścisz kontener i chcesz wrócić tam, gdzie skończyłeś:

docker ps -a
docker start -i containerid

Myślę, że to przydatne, gdy nie nazwałeś wszystko z poleceniem typu

docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash

Jasne metoda hakera, ale co z tego!

 3
Author: colin lamarre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-27 02:42:05

Moja ulubiona metoda:

Kontenery:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

Plik.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

Lub

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt
 2
Author: user3159411,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-16 02:59:07