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?
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.
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
-
Pobierz nazwę kontenera lub krótki identyfikator kontenera:
$ docker ps
-
Get full container id:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
-
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
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
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
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
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
-
Utwórz nowy plik dockerfile i Użyj istniejącego obrazu jako bazy.
FROM myName/myImage:latest ADD myFile.py bin/myFile.py
-
Następnie zbuduj kontener:
docker build .
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.
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:
-
Z kontenera do hosta
docker cp container_id:./bar/foo.txt .
-
Z hosta do kontenera
docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
-
Drugie podejście do kopiowania z hosta do kontenera:
docker cp foo.txt mycontainer:/foo.txt
-
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
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.
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.
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ą.
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
.
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.
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 .
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.
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/
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/
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
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
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".
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
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"
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.
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
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.
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/
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.
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.
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!
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
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