Próbuję zbudować rozwiązanie do tworzenia kopii zapasowych i przywracania dla kontenerów Docker, z którymi współpracujemy.
Mam podstawowy obraz Dockera, który utworzyłem ubuntu:base
i nie chcę go za każdym razem przebudowywać za pomocą pliku Docker, aby dodać do niego pliki.
Chcę utworzyć skrypt uruchamiany z komputera hosta i tworzy nowy kontener za pomocą ubuntu:base
obrazu Docker, a następnie kopiuje pliki do tego kontenera.
Jak mogę skopiować pliki z hosta do kontenera?
docker
docker-container
użytkownik3001829
źródło
źródło
Odpowiedzi:
cp
Komenda może być używany do kopiowania plików.Jeden konkretny plik można skopiować do kontenera, na przykład:
Jeden konkretny plik można skopiować z kontenera, np .:
Dla podkreślenia,
mycontainer
to pojemnik ID, nie obrazu ID.Wiele plików zawartych w folderze
src
można skopiować dotarget
folderu za pomocą:Odniesienie: Dokumentacja interfejsu Docker CLI dla
cp
W wersjach Docker wcześniejszych niż 1.8 możliwe było tylko kopiowanie plików z kontenera na host. Nie od hosta do kontenera.
źródło
COPY
preferowane,ADD
jeśli dotyczy.docker cp
do kopiowania z kontenera do hosta działa dobrze, ale kiedy używasz go do kopiowania plików z hosta do kontenera, bez efektu ... ktoś wie dlaczego? wersja dokera: wersja Docker 1.10.3, kompilacja cb079f6-nieobsługiwanaUzyskaj nazwę kontenera lub krótki identyfikator kontenera:
Uzyskaj pełny identyfikator kontenera:
Skopiować plik:
PRZYKŁAD:
lub
źródło
aufs
tylkodevicemapper
. Najłatwiejszym sposobem sprawdzenia ścieżki montażu kontenerów (gdy jest ona uruchomiona) jest uruchomienie poleceniamount
./var/lib/docker/aufs/diff/<id>/
/var/lib
dla mnie.find / -name docker
też nie było pomocne.Najczystszym sposobem jest zamontowanie katalogu hosta na kontenerze podczas uruchamiania kontenera:
źródło
docker run -d -p -v /host/path:/mnt --name container_name image_name
docker cp
to operacja jednostronna!Poniższy sposób jest dość brzydki, ale działa.
źródło
docker commit `docker ps -l -q` ubuntu-with-file
. W przeciwnym razie zmiana zostanie utracona (użyj dowolnego imienia zamiastubuntu-with-file
)docker exec
funkcji do pracy z uruchomionym kontenerem:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
docker exec -i ...
zamiast-it
, ponieważ nie ma TTY podczas przesyłania z pliku.tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
Jeśli musisz to zrobić na działającym kontenerze, możesz użyć exec Dockera (dodany w 1.3).
Najpierw znajdź nazwę lub identyfikator pojemnika:
W powyższym przykładzie możemy użyć
b9b7400ddd8f
alboelated_hodgkin
.Jeśli chcesz skopiować wszystko
/tmp/somefiles
na hoście do/var/www
kontenera:Następnie możemy wykonać
/bin/bash
w kontenerze i sprawdzić, czy zadziałało:źródło
Utwórz nowy plik dokera i użyj istniejącego obrazu jako podstawy.
Następnie zbuduj kontener:
źródło
Rozwiązanie podano poniżej,
Z powłoki Dockera
Od gospodarza
Plik należy skopiować bezpośrednio do lokalizacji, w której kontener znajduje się w systemie plików.
źródło
Zazwyczaj są trzy typy:
Od kontenera do hosta
Od hosta do kontenera
Z pojemnika do pojemnika miesza 1 i 2
źródło
Innym rozwiązaniem do kopiowania plików do działającego kontenera jest użycie tar:
Kopiuje plik
foo.sh
do/tmp
kontenera.Edycja: Usuń reduntant
-f
, dzięki komentarzowi Maarten .źródło
-f -
to jednak trochę zbędne, domyślnym zachowaniem jest jednak pisanie na standardowe wyjście.Aby skopiować plik z hosta do uruchomionego kontenera
Na podstawie odpowiedzi Erika i komentarzy Mikla i z0r.
źródło
Dzięki Docker 1.8
docker cp
jest w stanie kopiować pliki z hosta do kontenera. Zobacz post na blogu Docker Ogłoszenie Docker 1.8: Zaufanie do zawartości, Przybornik i aktualizacje rejestru i organizacji .źródło
docker cp foo.txt mycontainer:/foo.txt
To jest bezpośrednia odpowiedź na pytanie „Kopiowanie plików z hosta do kontenera Docker” postawione w tym pytaniu w tytule.
Spróbować
docker cp
. Jest to najprostszy sposób, aby to zrobić i działa nawet na moim komputerze Mac. Stosowanie:Spowoduje to skopiowanie pliku
some-file.txt
z katalogu/root
na komputerze hosta do kontenera Docker o nazwie podanej wsome-docker-container
katalogu/root
. Jest to bardzo zbliżone do bezpiecznej składni kopii. I jak pokazano w poprzednim poście, możesz użyć go na odwrót. To znaczy, kopiujesz również pliki z kontenera na host.I zanim prześlesz ten post w dół, wpisz
docker cp --help
. Czytanie dokumentacji może być bardzo pomocne, czasami ...Jeśli nie podoba ci się w ten sposób i chcesz mieć woluminy danych w już utworzonym i działającym kontenerze, odtwarzanie jest dziś twoją jedyną opcją. Zobacz także Jak mogę dodać wolumin do istniejącego kontenera Docker? .
źródło
Wypróbowałem tutaj większość (pozytywnych) rozwiązań, ale w oknie dokowanym 17.09 (w 2018 r.) Nie ma już folderu / var / lib / docker / aufs.
To proste
docker cp
rozwiązało to zadanie.Jak zdobyć nazwę kontenera?
Jest
NAMES
sekcja. Nie używajIMAGE
.źródło
Aby skopiować pliki / foldery między kontenerem a lokalnym systemem plików, wpisz polecenie:
Na przykład,
Aby uzyskać identyfikator contianer, wpisz podane polecenie:
Powyższa treść pochodzi z witryny docker.com .
źródło
Zakładając, że kontener już działa, wpisz podane polecenie:
Aby udostępnić pliki za pomocą udostępnionego katalogu, uruchom kontener, wpisując podane polecenie:
Uwaga: mogą wystąpić problemy z uprawnieniami, ponieważ użytkownicy kontenera nie są tacy sami jak użytkownicy hosta.
źródło
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
cat
nie zostanie zakończone po wyjściu. Jeśli ma to dla ciebie znaczenie (jeśli kopiujesz skrypty bash, bash odmówi ich uruchomienia), powinieneś uruchomićlsof | grep yourfilename
i zabićcat
proces, który przechowuje wspomniany plik.kill $(lsof | grep /path/to/file | sed ...)
. Będę wdzięczny za twoją pomockill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
Oto polecenie kopiowania danych z Dockera na Host:
Poniżej znajduje się polecenie kopiowania danych z hosta do dokera:
źródło
W środowisku dokera 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/
źródło
tar
idocker cp
są dobrym zestawem do kopiowania wszystkiego w katalogu.Utwórz kontener woluminu danych
Aby zachować hierarchię katalogów
Sprawdź swoją pracę
źródło
Jeśli hostem jest CentOS lub Fedora, serwer proxy NIE jest w
/var/lib/docker/aufs
, ale znajduje się poniżej/proc
:To polecenie cmd skopiuje całą zawartość
data
katalogu do/
kontenera o identyfikatorze „containerid”.źródło
/proc
). Rozszerz także ścieżkę, aby umieścić plik w innym miejscu, nie tylko root.W przypadku, gdy dla kogoś takiego jak ja nie jest jasne, co
mycontainer
oznacza odpowiedź @ h3nrik, w rzeczywistości jest to identyfikator kontenera. Aby skopiować plikWarpSquare.mp4
w/app/example_scenes/1440p60
od wyszły pojemnika Döcker do bieżącego folderu użyłem tego.gdzie
docker ps -q -l
pobiera identyfikator kontenera ostatniej opuszczonej instancji. W przypadku, gdy nie jest to opuszczony pojemnik, możesz go zdobyć przezdocker container ls
lubdocker ps
źródło
docker ps -a
lubdocker container ls -a
.Wiele osób, które znajdą to pytanie, może faktycznie mieć problem z kopiowaniem plików do obrazu Docker podczas jego tworzenia (ja to zrobiłem).
W takim przypadku możesz użyć
COPY
poleceniaDockerfile
użytego do utworzenia obrazu.Zobacz dokumentację .
źródło
Możesz po prostu prześledzić adres IP swojego komputera lokalnego za pomocą
Następnie po prostu wejdź do swojego kontenera Docker i wpisz
W każdym razie, jeśli nie masz zainstalowanego klienta SSH i serwera, po prostu zainstaluj go za pomocą:
źródło
Jest to narzędzie do kopiowania pojedynczego pliku podczas uruchamiania kontenera tomcat.
Spowoduje to skopiowanie pliku wojny do katalogu webapps i uruchomienie aplikacji w krótkim czasie.
źródło
Składnia w górę kontenera:
W pliku dokera
źródło
Najlepszym sposobem na skopiowanie plików do kontenera, który znalazłem, jest zamontowanie katalogu na hoście przy użyciu
-v
opcji polecenia docker run.źródło
Istnieją dobre odpowiedzi, ale zbyt szczegółowe. Okazało się, że
docker ps
to dobry sposób na uzyskanie identyfikatora kontenera, który Cię interesujeaby zobaczyć, gdzie zamontowano wolumin. To jest
dla mnie, ale może to być inna ścieżka w zależności od systemu operacyjnego i konfiguracji. Teraz wystarczy skopiować pliki do tej ścieżki.
Korzystanie
-v
nie zawsze jest praktyczne.źródło
Właśnie zacząłem używać dokera do kompilacji VLC, oto co możesz zrobić, aby skopiować pliki tam iz powrotem z kontenerów:
Wyszukaj znajomy plik w tym txt, a będziesz mieć folder, cd do niego jako root i voila! skopiuj wszystko, co chcesz.
Może być ścieżka z „scalonymi”, myślę, że chcesz tę z „diff”.
Również jeśli wyjdziesz z kontenera i chcesz wrócić tam, gdzie go przerwałeś:
Wydaje mi się, że jest to przydatne, gdy nic nie nazwałeś poleceniem typu
Pewnie metoda hakera, ale co z tego!
źródło
Na przykład chcę skopiować mój plik xxxx / download / jenkins do tomcat
Zaczynam dostawać identyfikator kontenera Tomcat
źródło
Moja ulubiona metoda:
POJEMNIKI:
plik.txt
lub
źródło
Moim zdaniem nie musisz kopiować plików wewnątrz obrazu, ale możesz użyć GIT lub SVN dla swoich plików, a następnie ustawić wolumin zsynchronizowany z folderem lokalnym. Użyj skryptu podczas uruchamiania kontenera, który może sprawdzić, czy dane już istnieją w folderze lokalnym, jeśli nie skopiuj go z repozytorium GIT. Dzięki temu Twój obraz jest bardzo lekki.
źródło