
Ein Werkzeug zum Erkunden jeder Schicht in einem Docker-Image.
Ein Werkzeug zum Erkunden eines Docker-Images, der Layer-Inhalte und zum Entdecken von Möglichkeiten, die Größe Ihres Docker/OCI-Images zu verringern.

Um ein Docker-Image zu analysieren, führen Sie dive einfach mit einem Image-Tag/ID/Digest aus:
dive <your-image-tag>
oder du kannst direkt mit Docker eintauchen:
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive"
dive <your-image-tag>
# for example
dive nginx:latest
oder wenn Sie Ihr Image erstellen und dann direkt mit der Analyse beginnen möchten:
dive build -t <some-tag> .
Auf macOS bauen (unterstützt nur die Docker-Container-Engine):
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$(pwd)":"$(pwd)" \
-w "$(pwd)" \
-v "$HOME/.dive.yaml":"$HOME/.dive.yaml" \
docker.io/wagoodman/dive:latest build -t <some-tag> .
Zusätzlich können Sie dies in Ihrer CI-Pipeline ausführen, um sicherzustellen, dass Sie verschwendeten Speicherplatz auf ein Minimum beschränken (dies überspringt die UI):
CI=true dive <your-image>

Dies ist Beta-Qualität! Zögern Sie nicht, ein Issue einzureichen, wenn Sie ein neues Feature wünschen oder einen Fehler finden :)
Inhalt des Docker-Images nach Layer aufgeschlüsselt anzeigen
Wenn Sie links einen Layer auswählen, wird rechts der Inhalt dieses Layers zusammen mit allen vorherigen Layern angezeigt. Außerdem können Sie den Dateibaum vollständig mit den Pfeiltasten erkunden.
Anzeigen, was sich in jedem Layer geändert hat
Geänderte, modifizierte, hinzugefügte oder entfernte Dateien werden im Dateibaum gekennzeichnet. Dies kann so angepasst werden, dass Änderungen für einen bestimmten Layer oder aggregierte Änderungen bis zu diesem Layer angezeigt werden.
„Image-Effizienz“ schätzen
Der untere linke Bereich zeigt grundlegende Layer-Informationen und eine experimentelle Metrik, die schätzt, wie viel verschwendeter Speicherplatz in Ihrem Image enthalten ist. Dies kann durch duplizierte Dateien über Layer hinweg, das Verschieben von Dateien zwischen Layern oder nicht vollständig entfernte Dateien verursacht werden. Es werden sowohl ein prozentualer „Score“ als auch der gesamte verschwendete Dateispeicherplatz angegeben.
Schnelle Build-/Analysezyklen
Sie können ein Docker-Image erstellen und mit einem einzigen Befehl sofort analysieren:
dive build -t some-tag .
Sie müssen lediglich Ihren docker build-Befehl durch denselben dive build-Befehl ersetzen.
CI-Integration
Analysieren Sie ein Image und erhalten Sie ein Bestanden/Nicht-bestanden-Ergebnis basierend auf der Image-Effizienz und dem verschwendeten Speicherplatz. Setzen Sie einfach CI=true in der Umgebung, wenn Sie einen gültigen dive-Befehl aufrufen.
Mehrere Image-Quellen und unterstützte Container-Engines
Mit der Option --source können Sie auswählen, woher das Container-Image abgerufen werden soll:
dive <your-image> --source <source>
oder stellen Sie dem Bild ein <source>://-Schema voran:
dive <source>://<your-image>
Die dateibasierten Quellen verwenden ebenfalls die Form <source>:<path>, die auch andere anchore-Tools nutzen (z. B. dive oci-dir:./layout).
Bei jeder anderen Quelle wird ein einzelner Doppelpunkt als Image-Name und Tag gelesen, sodass dive docker:dind das
Image docker:dind analysiert.
| Quelle | Liest das Image aus |
|---|---|
docker | der Docker-Engine (der Standard). Lokal fehlende Images werden über die Docker-API gepullt, mit Anmeldedaten aus deiner Docker-Konfiguration. DOCKER_HOST, DOCKER_CONTEXT und der aktuelle Docker-Kontext werden berücksichtigt |
podman | Podman. Unter Linux wird der lokale Speicher direkt gelesen (kein Socket nötig, siehe containers-storage, und ein Kurzname wie myapp findet auch podmans localhost/myapp), mit Rückfall auf den Podman-Socket. Unter macOS wird der API-Socket der laufenden Podman-Maschine verwendet (ermittelt über podman machine inspect); CONTAINER_HOST=unix://... überschreibt dies, SSH-Verbindungen werden abgelehnt |
docker-archive | ein docker save-Tarball auf der Festplatte oder ein OCI-Archiv (docker-tar ist ein Alias) |
oci-archive | ein OCI-Image-Layout-Tarball auf der Festplatte |
oci-dir | ein OCI-Image-Layout-Verzeichnis auf der Festplatte |
registry | eine Registry, ohne Container-Engine (Anmeldedaten aus deiner Docker-Konfiguration). Registries auf privaten IP-Adressen werden abgelehnt, da sie über einfaches HTTP erreicht würden |
containerd | der containerd-Daemon (CONTAINERD_NAMESPACE wählt den Namespace) |
containers-storage | der lokale Podman-/Buildah-Speicher (nur Linux, siehe unten) |
auto | automatisch erkennen: zuerst Dateien auf der Festplatte, dann docker, podman, containerd und containers-storage, dann ein Registry-Pull. Die gewählte Quelle wird gemeldet, da ein Image, das keine lokale Engine hat, stillschweigend aus einer Registry stammt (Docker Hub bei einem Kurznamen). Nur gültig für --source, nicht als Schema |
Bei einem Multi-Platform-Image wählt --platform die zu analysierende Variante (z. B. --platform linux/arm64). Ein docker save-
Tarball enthält eine einzelne Plattform; dive meldet, wenn sie nicht übereinstimmt.
Die containers-storage-Unterstützung wird nur mit dem Build-Tag containers_image_openpgp einkompiliert, den die Linux-
Release-Builds (und das Docker-Image) haben. Ohne ihn meldet die Quelle, dass sie nicht verfügbar ist. Um sie selbst zu bauen: go build -tags containers_image_openpgp,exclude_graphdriver_btrfs ./cmd/dive.
JSON-Export
--json <path> überspringt die UI und schreibt die Analyse in eine Datei. Die id jeder Ebene ist die Diff-ID der Ebene (derselbe Wert wie digestId).
Ubuntu/Debian
Mit debs:
DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -fOL "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb"
sudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb
Mit snap:
sudo snap install docker
sudo snap install dive
sudo snap connect dive:docker-executables docker:docker-executables
sudo snap connect dive:docker-daemon docker:docker-daemon
[!CAUTION] Die Snap-Methode wird nicht empfohlen, wenn Sie Docker über
apt-getinstalliert haben, da sie Ihren bestehenden Docker-Daemon beschädigen könnte.Siehe auch: https://github.com/wagoodman/dive/issues/546
RHEL/Centos
DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -fOL "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.rpm"
rpm -i dive_${DIVE_VERSION}_linux_amd64.rpm
Arch Linux