Kopiowanie plików z hosta do kontenera dokera

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 do kontenera?

 946
Author: Peter Mortensen, 2014-04-07

30 answers

Polecenie cp może być używane do kopiowania plików. Jeden konkretny plik można skopiować w następujący sposób:

docker cp foo.txt mycontainer:/foo.txt
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 wersjach Dockera przed 1.8 możliwe było jedynie kopiowanie plików z kontenera do hosta. Nie od gospodarza do Pojemnik.

 1626
Author: h3nrik,
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-13 03:42:28
  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
 152
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
 113
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
 103
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
 37
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

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.

 33
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

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.

 25
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

Very easy

  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 .
    
 23
Author: Rusty Shackleford,
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-26 08:31:39

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.

 19
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

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.

 11
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

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?.

 11
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

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.

 7
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

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/

 6
Author: aabdulwahed,
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

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 .

 6
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

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
 4
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

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

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? (Istnieje NAMES sekcja. Nie używaj IMAGE.)

 docker ps 
 4
Author: Aaron,
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-01-17 21:18:54

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ę .

 3
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

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".

 3
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

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

 2
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.

 2
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

Po prostu kopiuję plik bezpośrednio z miejsca, w którym znajduje się kontener z komputera hosta.

Na przykład:

Najpierw sprawdź identyfikator kontenera:

root@**3aed62678d54**:/home#

A następnie z hosta, powiedzmy, że plik znajduje się w katalogu domowym:

root@saasdock:/home/dnepangue# cp cheering_nasa.gif /var/lib/docker/aufs/mnt/**3aed62678d54**a5df47a4a00a58bb0312009c2902f8a37498a1427052e8ac454b/home/

Z powrotem do pojemnika...

root@**3aed62678d54**:/home# ls cheering_nasa.gif
 1
Author: asterinux,
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:27:19

Jeśli używasz Windows jako hosta, możesz użyć WinSCP aby połączyć się z Dockerem i przesłać pliki przez GUI.

Jeśli w Linuksie, polecenie scp będzie również działać przez terminal.

 1
Author: R.K,
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:43:53

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.

 1
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

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

 1
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

Jeśli nie masz katalogu zdefiniowanego jako wolumin w pliku Dockerfile,/var/lib/docker/aufs/ mnt/ / będzie działać. Są jednak przypadki, w których katalog wewnątrz kontenera jest zdefiniowany jako wolumin. W tym przypadku zawartość pod aufs/ mnt / * / i zawartość widziana przez kontener są różne.

Będziesz musiał sprawdzić kontener za pomocą docker inspect, a następnie poszukaj woluminów. Znajdziesz tam wzmiankę o czymś takim jak / var / lib/Docker/VFS/dir / fe940b... (id). Musisz dodać/zmodyfikować pliki tutaj zamiast pod aufs/mnt/*.

Mylące jest to, że pliki pojawiają się również w /aufs/mnt/*. Spędziłem trochę czasu drapiąc się po głowie, dlaczego zmiany tutaj nie działają na mnie. Mam nadzieję, że to komuś pomoże.

 0
Author: user3392439,
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-09-28 10:40:00

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
 0
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

Montowaĺ 'em a nastÄ ™ pnie uruchamiaĺ' em obraz za pomocÄ ... demona, byle jaki jak podano tutaj;

docker run -d -v /blah1/blah2:/mnt --name mntcontainer ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

Then

docker exec -it mntcontainer bash
 0
Author: East2West,
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-01-31 23:42:44

Innym obejściem jest użycie starego, dobrego scp. Jest to przydatne w przypadku, gdy trzeba skopiować katalog.

From your host run:

scp FILE_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp foo.txt 172.17.0.2:foo.txt

W przypadku konieczności skopiowania katalogu:

scp -r DIR_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp -r directory 172.17.0.2:directory

Należy również zainstalować ssh w kontenerze.

apt-get install openssh-server
 0
Author: gaetano,
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-08-29 11:34:13

Jedna rzecz, którą próbowałem i zadziałało

Po uruchomieniu kontenera Dockera i utworzeniu pliku pod nim, możesz łatwo uzyskać do niego dostęp z poniższej lokalizacji hosta Dockera: -

Cd /var/lib/Docker/aufs/containers/container_id/tmp

Spróbuj raz!

 0
Author: Harshal Vaidya,
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-08-02 10:00:21