Za pomocą okna dokowanego zauważyłem, że muszę zrozumieć, co dzieje się w kontenerze lub jakie pliki tam są. Jednym z przykładów jest pobieranie obrazów z indeksu dokowania - nie masz pojęcia, co zawiera obraz, więc uruchomienie aplikacji jest niemożliwe.
Idealne byłoby, aby móc w nich ssh lub równorzędnie. Czy istnieje na to narzędzie, czy też moja konceptualizacja dokera jest błędna w myśleniu, że powinienem to zrobić.
linux
docker
filesystems
użytkownik2668128
źródło
źródło
docker exec <container> bash
. Po prostu otwórz skorupę w pojemniku.docker exec <container> ls <dir path>
idocker exec <container> cat <file path>
. Jednak dla bash dodaj-it
opcje.docker image save image_name > image.tar
jak wskazano w odpowiedzi z @ Gaurav24.Odpowiedzi:
AKTUALIZACJA
Najłatwiejsza metoda: za pomocą exec docker
Docker w wersji 1.3 lub nowszej obsługuje polecenie
exec
zachowujące się podobniensenter
. Ta komenda może uruchomić nowy proces w już działającym kontenerze (kontener musi już mieć uruchomiony proces PID 1). Możesz uruchomić,/bin/bash
aby zbadać stan kontenera:zobacz dokumentację wiersza polecenia Docker
Alternatywna metoda 1
Migawka
Możesz ocenić system plików kontenera w ten sposób:
W ten sposób możesz ocenić system plików uruchomionego kontenera w dokładnym momencie. Kontener nadal działa, nie uwzględnia się przyszłych zmian.
Możesz później usunąć migawkę za pomocą (nie ma to wpływu na system plików uruchomionego kontenera!):
Alternatywna metoda 2
ssh
Jeśli potrzebujesz ciągłego dostępu, możesz zainstalować sshd w kontenerze i uruchomić demona sshd:
W ten sposób możesz uruchomić aplikację za pomocą ssh (podłącz i uruchom co chcesz).
AKTUALIZACJA: Alternatywna metoda 3
nsenter
Użyj
nsenter
, patrz https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/źródło
Option 1
.RUN apk update && apk add bash
(rozmiar: ~ 4 MB)docker exec -t -i mycontainer /bin/sh
AKTUALIZACJA: ODKRYWANIE!
To polecenie powinno umożliwić eksplorację działającego kontenera dokowanego :
Odpowiednikiem tego w docker-compose byłoby:
(web jest nazwą usługi w tym przypadku i domyślnie ma tty).
Kiedy już będziesz w środku:
lub dowolne inne polecenie bash, takie jak:
To polecenie powinno umożliwić eksplorację obrazu dokera :
w środku wykonaj:
lub dowolne inne polecenie bash, takie jak:
-it
Oznacza interaktywnej ... a tty.To polecenie powinno umożliwić sprawdzenie działającego kontenera lub obrazu dokowanego :
docker inspect name-of-container-or-image
Możesz to zrobić i dowiedzieć się, czy jest tam
bash
czysh
tam. Poszukaj punktu wejścia lub cmd w zwrocie JSON.patrz dokumentacja exec dokera
zobacz dokumentację exec-docker-compose
patrz doker inspekcji dokumentacji
źródło
docker exec -ti <name> powershell
( źródło )docker exec -ti <name> cmd
działał. W przypadku innych początkujących, takich jak ja, pamiętaj o użyciu nazwy instancji kontenera zdocker ps
(coś takiego jak 070494393ca5) zamiast czytelnej nazwy, którą jej przypisałeś.W przypadku zatrzymania kontenera lub braku powłoki (np.
hello-world
Wspomnianej w instrukcji instalacji lub niealpine
traefik
), jest to prawdopodobnie jedyna możliwa metoda eksploracji systemu plików.Możesz zarchiwizować system plików swojego kontenera w pliku tar:
Lub wylistuj pliki:
Pamiętaj, że w zależności od obrazu może to zająć trochę czasu i miejsca na dysku.
źródło
export
powyższego przykładu trafiła w dziesiątkę:docker export adoring_kowalevski | tar tf -
f -
na końcu polecenia nie powinieneś potrzebować , tar domyślnie czyta ze standardowego wejścia. Po prostudocker export adoring_kowalevski | tar t
działa.tar f
zależy od konfiguracji użytkownika. Jedna część toTAPE
zmienna środowiskowa. Inne są kontrolowane w ramach kompilacji. Efektem netto jest to, że nigdy nie należy zakładać, że czyta stdin lub pisze stdout, ale zawsze podaje to wprost.System plików kontenera znajduje się w folderze danych dokera, zwykle w / var / lib / docker. Aby uruchomić i sprawdzić działający system plików kontenerów, wykonaj następujące czynności:
A teraz bieżący katalog roboczy jest katalogiem głównym kontenera.
źródło
Przed utworzeniem kontenera:
Jeśli chcesz zbadać strukturę obrazu zamontowanego wewnątrz kontenera, możesz to zrobić
Zapewniłoby to widoczność wszystkich warstw obrazu i jego konfiguracji, która jest obecna w plikach json.
Po utworzeniu kontenera:
Do tego jest już wiele odpowiedzi powyżej. mój preferowany sposób to:
źródło
Najbardziej pozytywna odpowiedź działa dla mnie, kiedy kontener jest faktycznie uruchomiony, ale kiedy nie można uruchomić i na przykład chcesz skopiować pliki z kontenera, to wcześniej mnie to zapisało:
Dzięki dockerowi cp ( link ) możesz kopiować bezpośrednio z kontenera, ponieważ był to jakikolwiek inny element twojego systemu plików. Na przykład odzyskiwanie wszystkich plików w kontenerze:
Pamiętaj, że nie musisz określać, że chcesz kopiować rekurencyjnie.
źródło
Na Ubuntu 14.04 z systemem Docker 1.3.1 znalazłem główny system plików kontenera na hoście w następującym katalogu:
Pełna informacja o wersji Docker:
źródło
devicemapper
katalogu). Plik istnieje pod/var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...
. Nie jestem pewien, jak przenośny / bezpieczny jest dostęp do plikówdirect-lvm
.Spróbuj użyć
Może istnieć możliwość, że bash nie zostanie zaimplementowany. do tego możesz użyć
źródło
Używam innej brudnej sztuczki, która jest agnostyczna aufs / devicemapper.
Patrzę na polecenie, które uruchamia kontener np.
docker ps
I jeśli jest to apache lubjava
po prostu wykonuję następujące czynności:i voilá jesteś w pojemniku.
Zasadniczo możesz jako główny dysk CD w
/proc/<PID>/root/
folderze, o ile proces ten jest uruchamiany przez kontener. Uważaj dowiązania symboliczne nie będą miały sensu podczas korzystania z tego trybu.źródło
Najczęściej głosowana odpowiedź jest dobra, chyba że twój kontener nie jest rzeczywistym systemem Linux.
Wiele kontenerów (szczególnie tych opartych na go) nie ma żadnych standardowych plików binarnych (nie
/bin/bash
lub/bin/sh
). W takim przypadku musisz uzyskać bezpośredni dostęp do rzeczywistego pliku kontenerów:Działa jak marzenie:
Uwaga: musisz uruchomić go jako root.
źródło
W moim przypadku żadna powłoka nie była obsługiwana w kontenerze, z wyjątkiem
sh
. To zadziałało jak urokźródło
możesz użyć nurkowania do interaktywnego przeglądania zawartości obrazu za pomocą TUI
https://github.com/wagoodman/dive
źródło
Spowoduje to uruchomienie sesji bash dla obrazu:
Uruchom okno dokowane --rm -it --entrypoint = / bin / bash
źródło
Dla mnie ten działa dobrze (dzięki ostatnim komentarzom do wskazania katalogu / var / lib / docker / ):
Tutaj 2465790aa2c4 jest krótki identyfikator systemem pojemnika (jak wyświetlane przez Döcker ps ), a następnie przez gwiazdę.
źródło
W nowszych wersjach Dockera możesz uruchomić,
docker exec [container_name]
który uruchamia powłokę w twoim kontenerzeAby uzyskać listę wszystkich plików w kontenerze, po prostu uruchom
docker exec [container_name] ls
źródło
W przypadku sterownika dokującego aufs:
Skrypt znajdzie katalog główny kontenera (Test w oknie dokowanym 1.7.1 i 1.10.3)
źródło
Żadna z istniejących odpowiedzi nie dotyczy przypadku kontenera, który opuścił (i nie można go zrestartować) i / lub nie ma zainstalowanej powłoki (np. Bez destylacji). Ten działa tak długo, jak masz dostęp root do hosta Docker.
W celu prawdziwej ręcznej kontroli najpierw sprawdź identyfikatory warstw:
Na wyjściu powinieneś zobaczyć coś takiego
Przejdź do tego folderu (jako root), aby znaleźć bieżący widoczny stan systemu plików kontenera.
źródło
Ta odpowiedź pomoże tym (jak ja), którzy chcą eksplorować system plików woluminu dokującego, nawet jeśli kontener nie jest uruchomiony.
Lista uruchomionych kontenerów dokowanych:
docker ps
=> ID POJEMNIKA „4c721f1985bd”
Spójrz na punkty montowania woluminu dokera na lokalnym komputerze fizycznym ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
Mówi mi to, że lokalny fizyczny katalog maszynowy / tmp / container-garren jest odwzorowany na miejsce docelowe woluminu dokowanego / tmp.
Znajomość lokalnego katalogu fizycznej maszyny (/ tmp / container-garren) oznacza, że mogę badać system plików, niezależnie od tego, czy jest uruchomiony kontener dokera. Było to bardzo ważne, aby pomóc mi zorientować się, że istnieją pewne dane resztkowe, które nie powinny były zostać utrwalone nawet po wyłączeniu kontenera.
źródło
inną sztuczką jest użycie narzędzia atomowego do zrobienia czegoś takiego:
Obraz Dockera zostanie zamontowany w / path / to / mnt, abyś mógł go obejrzeć.
źródło
Tylko dla LINUX
Najprostszym sposobem, którego używam, było użycie proc dir, czyli kontenera, który musi być uruchomiony, aby sprawdzić pliki kontenera dokera.
Znajdź identyfikator procesu (PID) kontenera i zapisz w jakiejś zmiennej
Upewnij się, że proces kontenerowy jest uruchomiony, i użyj zmiennej nameto, aby dostać się do folderu kontenera
Jeśli chcesz przejść przez katalog bez znajdowania numeru PID, używając tylko tego długiego polecenia
Wskazówki:
Po wejściu do kontenera wszystko, co zrobisz, wpłynie na faktyczny proces kontenera, takie jak zatrzymanie usługi lub zmiana numeru portu.
Mam nadzieję, że to pomoże
Uwaga:
Ta metoda działa tylko wtedy, gdy kontener nadal działa, w przeciwnym razie katalog nie istniałby, gdyby kontener został zatrzymany lub usunięty
źródło
Mój preferowany sposób, aby zrozumieć, co dzieje się w pojemniku, to:
odsłonić -p 8000
Uruchom serwer w nim
źródło
W przypadku już działającego kontenera możesz wykonać:
Musisz być rootem, aby cd do tego katalogu. Jeśli nie jesteś rootem, spróbuj „sudo su” przed uruchomieniem polecenia.
Edycja: Po wersji 1.3 zobacz odpowiedź Jiriego - lepiej.
źródło
Jeśli korzystasz z Docker v19.03, wykonaj poniższe czynności.
źródło
Jeśli używasz sterownika magazynu AUFS, możesz użyć mojego skryptu warstwy dokowania, aby znaleźć katalog główny systemu plików dowolnego kontenera (mnt) i warstwę zapisu do zapisu:
Edytuj 2018-03-28:
Warstwa dokera została zastąpiona przez kopię zapasową dokera
źródło
docker exec
Polecenie uruchomienia polecenia uruchomionego w pojemniku może pomóc w wielu przypadkach.Na przykład :
1) Dostęp bash do działającego systemu plików kontenera:
2) Dostęp bash do działającego systemu plików kontenera jako root, aby mieć wymagane uprawnienia:
Jest to szczególnie przydatne, aby móc wykonać pewne przetwarzanie jako root w kontenerze.
3) Dostęp bash do działającego systemu plików kontenera z określonym katalogiem roboczym:
źródło
Możesz uruchomić bash wewnątrz kontenera za pomocą:
$ docker run -it ubuntu /bin/bash
źródło