Jak wyświetlić zawartość obrazu dokera

295

Wykonałem dokowanie i mogę wyświetlić listę pobranych obrazów. Chcę zobaczyć zawartość tego obrazu. Czy wyszukiwanie w sieci, ale nie ma prostej odpowiedzi.

pylearn
źródło
2
Możliwy duplikat systemu plików Eksploratora kontenera Docker
Vadzim,
10
Nie dupek. Wyświetlanie kontenera i obrazu to nie to samo. Możesz przejrzeć początkowy system plików lub nawet sprawdzić, czy w obrazie nie ma nic złośliwego, zanim zacznie działać.
Keilaron
4
jeśli nie możesz uruchomić obrazu jako kontenera, możesz użyć narzędzia takiego jak dysk ( github.com/wagoodman/dive ) lub możesz użyć opcji docker save, aby wyeksportować obraz jako plik tar. Następnie możesz zbadać smołę lub nurkować, aby jak najszybciej zbadać obraz.
FunThomas424242
To nie dupek, ale odpowiedź znajdziesz tutaj: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Odpowiedzi:

375

Możesz po prostu uruchomić interaktywny kontener powłoki za pomocą tego obrazu i przeglądać zawartość tego obrazu.

Na przykład:

docker run -it image_name sh

Lub obserwuj dla obrazów z entrypoint

docker run -it --entrypoint sh image_name

Lub, jeśli chcesz zobaczyć, jak zbudowano obraz, co oznacza jego kroki Dockerfile, możesz:

docker image history --no-trunc image_name > image_history

Kroki zostaną zalogowane do image_historypliku.

Ayman Nedjmeddine
źródło
1
Dzięki. Po pierwsze tego szukam. Zasadniczo przeglądaj foldery.
pylearn
9
Próbuję zobaczyć zawartość obrazu utworzonego za pomocą „FROM scratch” i nie ma dostępnej powłoki. Czy jest jakiś inny sposób, aby zobaczyć zawartość? Obraz, który próbuję zobaczyć, to portainer / portainer.
Juan Hernandez
2
Czy to możliwe, że ktoś zobaczy zawartość obrazu bez odradzania pojemnika? Czy możemy założyć, że jest bezpieczny dla wszystkich, chyba że mają prawa do odrodzenia z niego kontenera?
Shabirmean
3
połączenie tego, co zostało powiedziane wcześniej „dla kontenera Windows z punktem wejścia”: docker run -it --entrypoint cmd <image_name>zadziała.
Beytan Kurt,
2
@JuanHernandez, tak, możesz zrzucić całą zawartość obrazu, jak wskazano w stackoverflow.com/a/42677219/320594 .
Jaime Hablutzel
197

Przyjęta tutaj odpowiedź jest problematyczna, ponieważ nie ma gwarancji, że obraz będzie miał jakąkolwiek interaktywną powłokę. Na przykład, obraz drona / dron zawiera jedno polecenie /drone, a także ma ENTRYPOINTrównież, więc to się nie powiedzie:

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

A to się nie powiedzie:

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

To nie jest rzadka konfiguracja; wiele minimalnych obrazów zawiera tylko pliki binarne niezbędne do obsługi usługi docelowej. Na szczęście istnieją mechanizmy eksploracji systemu plików obrazu, które nie zależą od zawartości obrazu. Najłatwiejsze jest prawdopodobnie docker exportpolecenie, które wyeksportuje system plików kontenera jako archiwum tar. Tak więc uruchom kontener (nie ma znaczenia, czy zawiedzie, czy nie):

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Następnie użyj przycisku, docker exportaby wyeksportować system plików do tar:

$ docker export $(docker ps -lq) | tar tf -

docker ps -lqNie oznacza „dać mi identyfikator najnowszej pojemnika Döcker”. Możesz zastąpić to jawną nazwą kontenera lub identyfikatorem.

Larsks
źródło
5
ta odpowiedź jest bardzo pomocna, aby dowiedzieć się, co może być w danym momencie w pojemniku
João Andrade
2
Ta odpowiedź jest bardziej poprawna i działa dla mnie, ponieważ chcę eksplorować zawartość obrazu za pomocą zagranicznej architektury i nie mogę go „po prostu uruchomić”
Vladimir Perevalov,
95

Nie należy uruchamiać kontenera tylko po to, aby zobaczyć zawartość obrazu. Na przykład możesz poszukać złośliwej zawartości, a nie uruchamiać ją. Użyj „Utwórz” zamiast „Uruchom”;

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$
lgekman
źródło
11
Drugi wiersz powyżej zawiera tylko zawartość systemu plików. Jeśli chcesz pobrać wszystkie pliki jako tar, możesz je zastąpić czymś takim docker export tmp_$$ > image-fs.tar.
Pino
Jaka będzie druga linia dla systemu operacyjnego Windows? docker export tmp_$$ | tar tNie będzie działać.
Alexei Marinichenko
@Alexei Marinichenko tarmoże nie zostać zainstalowany na twoim komputerze. Spróbuj tar --helpto sprawdzić.
Abdurrahman I.
1
Działa to również wtedy, gdy w pojemniku nie ma powłoki
Peter Dotchev,
3
@AlexeiMarinichenko możesz użyć -oparametru, aby określić plik do zapisu. Np docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey
62
docker save nginx > nginx.tar
tar -xvf nginx.tar

Obecne są następujące pliki:

  • manifest.json - opisuje warstwy systemu plików i nazwę pliku json, który ma właściwości kontenera.
  • .json - Właściwości kontenera
  • - Każdy katalog „layerid” zawiera plik json opisujący właściwości warstwy i system plików związany z tą warstwą. Docker przechowuje obrazy kontenerów jako warstwy, aby zoptymalizować przestrzeń dyskową poprzez ponowne użycie warstw na obrazach.

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

LUB

możesz użyć nurkowania do interaktywnego przeglądania zawartości obrazu za pomocą TUI

wprowadź opis zdjęcia tutaj

https://github.com/wagoodman/dive

Andy Wong
źródło
5
Wydaje mi się to najbardziej przydatną odpowiedzią, ponieważ nie trzeba uruchamiać kontenera, aby uzyskać pliki.
Alec Thomas
1
Absolutnie się zgadzam @AlecThomas - i aby pójść o krok dalej, dlaczego muszę nawet dockerzobaczyć zawartość tego, co jest w zasadzie innym typem pliku archiwum.
Ed Randall
dobra odpowiedź, chciałbym również określić tag: docker save --output nginx.tar nginx:latest, w przeciwnym razie, zgodnie z doc, będzie zawierać „wszystkie warstwy nadrzędne, a wszystkie tagi + wersje”
Tarek
Powinno to zostać ocenione pozytywnie, ponieważ jest to prawdopodobnie jedyny sposób na zbadanie wewnętrznych elementów, jeśli nie masz w sobie żadnego z narzędzi uniksowych. Również w ten sposób nie wymaga utworzenia kontenera.
Stanislav German-Evtushenko
9

Aby wyświetlić szczegółową zawartość obrazu, musisz uruchomić, docker run --rm image/name ls -alRgdzie --rmoznacza usunięcie, jak tylko wyjdzie z pojemnika.

wprowadź opis zdjęcia tutaj

Serge Voloshenko
źródło
11
Zakłada się, że obraz jest lsdostępny iPATH
chaosaffe
6

ODKRYWANIE OBRAZU DOCKERA !

  1. Dowiedzieć się, jaki rodzaj powłoki jest tam bashalbo shalbo ...

    Najpierw sprawdź obraz: docker inspect name-of-container-or-image

    Poszukaj entrypointlub cmdw Json Return.

  2. Następnie wykonaj: docker run --rm -it --entrypoint=/bin/bash name-of-image

    w środku wykonaj: ls -lsalub dowolne inne polecenie powłoki, takie jak:cd ..

    -itOznacza interaktywnej ... a tty. --rmoznacza Zabrać pojemnik po uruchomieniu.

Khalil Gharbaoui
źródło
1
Problem z tą odpowiedzią jest to, że, jak to omówiono w przyjętym odpowiedź, nie ma gwarancji, że obraz ma żadnej powłoki w nim. Lub ls. Lub w ogóle jakiekolwiek popularne narzędzia.
larsks
3

Możemy wypróbować prostszy w następujący sposób:

docker image inspect image_id

Działa to w wersji Docker:

DockerVersion": "18.05.0-ce"
Subham Chowdhury
źródło
13
To nie pokazuje zawartości ; pokazuje tylko warstwy itp., które zostały wykorzystane do budowy obrazu.
Roger Lipscombe
0

Dzięki Docker EE dla Windows (17.06.2-ee-6 na Hyper-V Server 2016) cała zawartość kontenerów Windows może być badana na C:\ProgramData\docker\windowsfilter\ścieżce systemu operacyjnego hosta.

Nie wymaga specjalnego montażu.

Prefiks folderu można znaleźć na podstawie identyfikatora kontenera na docker ps -awyjściu.

Wadzim
źródło
-1

Istnieje bezpłatne narzędzie typu open source o nazwie Anchore, którego można użyć do skanowania obrazów kontenerów. To polecenie pozwala wyświetlić listę wszystkich plików w obrazie kontenera

zawartość obrazu anchore-cli myrepo / app: najnowsze pliki

https://anchore.com/opensource/

użytkownik11845290
źródło