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.



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.


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.


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_$$

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


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


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.


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"

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.


-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/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.