Anzeigen von Docker-Bildinhalten

291

Ich habe einen Docker gezogen und kann das heruntergeladene Bild auflisten. Ich möchte den Inhalt dieses Bildes sehen. Habe im Internet gesucht, aber keine klare Antwort.

pylearn
quelle
2
Mögliches Duplikat des Dateisystems
Vadzim
10
Kein Betrüger. Das Betrachten des Containers und des Bildes ist nicht dasselbe. Möglicherweise möchten Sie das ursprüngliche Dateisystem anzeigen oder sogar überprüfen, ob das Image schädlich ist, bevor es ausgeführt werden kann.
Keilaron
4
Wenn Sie das Image nicht als Container ausführen konnten, können Sie ein Tool wie Laufwerk ( github.com/wagoodman/dive ) oder Docker Save verwenden, um das Image als TAR-Datei zu exportieren. Dann können Sie den Teer erkunden oder mit einem Tauchgang so schnell wie möglich das Bild erkunden.
FunThomas424242
Kein Betrüger, aber Sie können die Antwort hier finden: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Antworten:

372

Sie können einfach einen interaktiven Shell-Container mit diesem Bild ausführen und den Inhalt des Bildes untersuchen.

Zum Beispiel:

docker run -it image_name sh

Oder folgen Sie für Bilder mit einem entrypoint

docker run -it --entrypoint sh image_name

Wenn Sie sehen möchten, wie das Image erstellt wurde, dh die darin enthaltenen Schritte Dockerfile, können Sie:

docker image history --no-trunc image_name > image_history

Die Schritte werden in der image_historyDatei protokolliert .

Ayman Nedjmeddine
quelle
1
Vielen Dank. Das erste ist, wonach ich suche. Grundsätzlich erkunden Sie die Ordner.
Pylearn
9
Ich versuche, den Inhalt eines Bildes zu sehen, das mit "FROM Scratch" erstellt wurde, und es ist keine Shell verfügbar. Gibt es eine andere Möglichkeit, den Inhalt anzuzeigen? Das Bild, das ich sehen möchte, ist portainer / portainer.
Juan Hernandez
2
Ist es möglich, dass jemand den Inhalt des Bildes sieht, ohne einen Container zu erzeugen? Oder können wir davon ausgehen, dass es vor allen sicher ist, es sei denn, sie haben das Recht, einen Container daraus zu erzeugen?
Shabirmean
3
Das Kombinieren der zuvor genannten Informationen "für einen Windows-Container mit dem Einstiegspunkt": docker run -it --entrypoint cmd <image_name>funktioniert.
Beytan Kurt
2
@JuanHernandez, ja, Sie können den gesamten Inhalt des Bildes wie unter stackoverflow.com/a/42677219/320594 angegeben sichern .
Jaime Hablutzel
197

Die hier akzeptierte Antwort ist problematisch, da nicht garantiert werden kann, dass ein Bild eine interaktive Shell enthält. Zum Beispiel enthält das Drohnen- / Drohnen- Image einen einzelnen Befehl /drone, und es hat auch einen ENTRYPOINT, so dass dies fehlschlägt:

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

Und das wird scheitern:

$ 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".

Dies ist keine ungewöhnliche Konfiguration. Viele minimale Bilder enthalten nur die Binärdateien, die zur Unterstützung des Zieldienstes erforderlich sind. Glücklicherweise gibt es Mechanismen zum Erkunden eines Bilddateisystems, die nicht vom Inhalt des Bildes abhängen . Am einfachsten ist wahrscheinlich der docker exportBefehl, mit dem ein Container- Dateisystem als Tar-Archiv exportiert wird . Starten Sie also einen Container (es spielt keine Rolle, ob er fehlschlägt oder nicht):

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

Verwenden Sie dann docker export, um das Dateisystem zu exportieren in tar:

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

Das docker ps -lq dort bedeutet "gib mir die ID des neuesten Docker-Containers". Sie können dies durch einen expliziten Containernamen oder eine ID ersetzen.

Larsks
quelle
5
Diese Antwort ist sehr hilfreich, um herauszufinden, was sich zu einem bestimmten Zeitpunkt in einem Container befinden könnte
João Andrade,
2
Diese Antwort ist korrekter und funktioniert für mich, da ich den Inhalt des Bildes mit fremder Architektur untersuchen möchte und es nicht "einfach ausführen" kann
Vladimir Perevalov
94

Sie sollten keinen Container starten, nur um den Bildinhalt zu sehen. Beispielsweise möchten Sie möglicherweise nach schädlichen Inhalten suchen und diese nicht ausführen. Verwenden Sie "create" anstelle von "run".

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$
lgekman
quelle
11
In der zweiten Zeile oben wird nur der Inhalt des Dateisystems aufgelistet. Wenn Sie alle Dateien als Teer erhalten möchten, können Sie sie durch etwas wie ersetzen docker export tmp_$$ > image-fs.tar.
Pino
Was wird die 2. Zeile für Windows sein? Das docker export tmp_$$ | tar twird nicht funktionieren.
Alexei Marinichenko
@Alexei Marinichenko ist tarmöglicherweise nicht auf Ihrem Computer installiert. Versuchen Sie es tar --helpzu überprüfen.
Abdurrahman I.
1
Dies funktioniert auch, wenn sich keine Shell im Container befindet
Peter Dotchev
3
@AlexeiMarinichenko Mit dem -oParameter können Sie die Datei angeben, in die geschrieben werden soll. ZB docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey
62
docker save nginx > nginx.tar
tar -xvf nginx.tar

Folgende Dateien sind vorhanden:

  • manifest.json - Beschreibt Dateisystemebenen und den Namen der JSON-Datei mit den Containereigenschaften.
  • .json - Containereigenschaften
  • - Jedes "Layer-ID" -Verzeichnis enthält eine JSON-Datei, die die Layereigenschaften und das Dateisystem beschreibt, die diesem Layer zugeordnet sind. Docker speichert Containerbilder als Ebenen, um den Speicherplatz zu optimieren, indem Ebenen über Bilder hinweg wiederverwendet werden.

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

ODER

Sie können tauchen , um den Bildinhalt interaktiv mit TUI anzuzeigen

Geben Sie hier die Bildbeschreibung ein

https://github.com/wagoodman/dive

Andy Wong
quelle
5
Dies scheint mir die nützlichste Antwort zu sein, da Sie keinen Container starten müssen, um die Dateien abzurufen.
Alec Thomas
1
Stimmen Sie @AlecThomas absolut zu - und um noch einen Schritt weiter zu gehen, warum muss ich überhaupt dockernur den Inhalt einer anderen Art von Archivdatei sehen?
Ed Randall
Gute Antwort, ich würde auch das Tag angeben: docker save --output nginx.tar nginx:latestAndernfalls enthält es laut Dokument "alle übergeordneten Ebenen und alle Tags + Versionen"
Tarek
Dies sollte positiv bewertet werden, da dies wahrscheinlich die einzige Möglichkeit ist, Interna zu erkunden, wenn Sie keine Unix-Utils enthalten. Auch auf diese Weise muss kein Container erstellt werden.
Stanislav German-Evtushenko
9

Zur Liste der detaillierten Inhalt eines Bildes müssen Sie laufen , docker run --rm image/name ls -alRwo --rmMittel entfernen, sobald Ausfahrten einen Behälter bilden.

Geben Sie hier die Bildbeschreibung ein

Serge Voloshenko
quelle
11
Dies setzt voraus, dass das Bild lsverfügbar ist und in derPATH
Chaosaffe
6

DOCKER IMAGE ENTDECKEN !

  1. Finde heraus, welche Art von Muschel sich dort befindet bashoder shoder ...

    Überprüfen Sie zuerst das Bild: docker inspect name-of-container-or-image

    Suchen Sie nach entrypointoder cmdin der json Rückkehr.

  2. Dann mach: docker run --rm -it --entrypoint=/bin/bash name-of-image

    Sobald Sie drinnen sind, tun Sie: ls -lsaoder einen anderen Shell-Befehl wie:cd ..

    Das -itsteht für interaktiv ... und tty. die --rmsteht für Behälter nach dem Lauf entfernen.

Khalil Gharbaoui
quelle
1
Das Problem bei dieser Antwort ist, dass, wie in der akzeptierten Antwort erläutert, keine Garantie dafür besteht, dass Ihr Bild eine Shell enthält. Oder ls. Oder wirklich irgendwelche gängigen Werkzeuge überhaupt.
Larsks
4

Wir können einen einfacheren wie folgt versuchen:

docker image inspect image_id

Dies funktionierte in der Docker-Version:

DockerVersion": "18.05.0-ce"
Subham Chowdhury
quelle
12
Der Inhalt wird nicht angezeigt . Es werden nur die Ebenen usw. angezeigt, mit denen das Bild erstellt wurde.
Roger Lipscombe
0

Mit Docker EE für Windows (17.06.2-ee-6 auf Hyper-V Server 2016) können alle Inhalte von Windows-Containern unter überprüft werden C:\ProgramData\docker\windowsfilter\ Pfad des Host-Betriebssystems .

Keine spezielle Montage erforderlich.

Das Ordnerpräfix kann anhand der Container-ID aus der docker ps -aAusgabe ermittelt werden.

Vadzim
quelle
-1

Es gibt ein kostenloses Open Source-Tool namens Anchore, mit dem Sie Containerbilder scannen können. Mit diesem Befehl können Sie alle Dateien in einem Container-Image auflisten

anchorore-cli Bildinhalt myrepo / app: neueste Dateien

https://anchore.com/opensource/

user11845290
quelle