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?
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.
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
-
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
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
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
Very easy
-
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
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.
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.
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ą.
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.
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/
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 .
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
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
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
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.
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".
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.
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
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
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.
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.
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
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.
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
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
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
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!
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