Aller au contenu
Conteneurs & Orchestration medium

Analysez vos images Docker avec Dive

12 min de lecture

Interface de Dive

Dive vous montre exactement ce qui se passe dans chaque couche de vos images Docker. En 5 minutes, vous saurez identifier les fichiers qui gaspillent de l’espace, comprendre pourquoi votre image est volumineuse, et intégrer une validation automatique dans vos pipelines CI/CD.

  • Explorer les couches : naviguer dans la structure interne d’une image avec l’interface TUI
  • Identifier l’espace gaspillé : repérer les fichiers dupliqués ou inutiles entre couches
  • Valider en CI/CD : bloquer les builds si l’efficacité est insuffisante
  • Exporter en JSON : intégrer les métriques dans vos outils de monitoring
FonctionnalitéDescription
Exploration TUIInterface terminal interactive pour naviguer dans les couches
Analyse d’efficacitéCalcul du pourcentage d’espace gaspillé
Mode CIValidation automatique avec seuils configurables
Export JSONDonnées structurées pour intégration externe
Multi-sourcesSupport Docker, Podman et archives
Fenêtre de terminal
# Télécharger la dernière version (v0.13.1)
DIVE_VERSION="0.13.1"
curl -fsSLO "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb"
sudo dpkg -i "dive_${DIVE_VERSION}_linux_amd64.deb"

Pour les distributions RPM (Fedora, RHEL) :

Fenêtre de terminal
DIVE_VERSION="0.13.1"
curl -fsSLO "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.rpm"
sudo rpm -i "dive_${DIVE_VERSION}_linux_amd64.rpm"

Vérification de l’installation :

Fenêtre de terminal
dive --version

Résultat attendu :

dive 0.13.1

Dive propose une interface terminal interactive (TUI) pour explorer les couches d’une image.

Fenêtre de terminal
dive nginx:1.27.3-alpine

L’interface s’ouvre avec deux panneaux principaux :

  • Panneau gauche : liste des couches avec leur taille et la commande Dockerfile associée
  • Panneau droit : arborescence des fichiers de la couche sélectionnée
ToucheAction
TabBasculer entre les panneaux
/ ou k / jNaviguer dans les listes
SpaceDéplier/replier un dossier
Ctrl+U / Ctrl+DPage haut / Page bas
Ctrl+AAfficher les fichiers ajoutés
Ctrl+RAfficher les fichiers supprimés
Ctrl+MAfficher les fichiers modifiés
Ctrl+BAfficher tous les fichiers non modifiés
Ctrl+SpaceBasculer entre vue couche / vue agrégée
Ctrl+LAfficher les détails de la couche
Ctrl+FFiltrer les fichiers
qQuitter

Dans l’arborescence des fichiers, Dive utilise des codes couleur :

CouleurSignification
VertFichier ajouté dans cette couche
RougeFichier supprimé dans cette couche
JauneFichier modifié dans cette couche
BlancFichier inchangé (hérité des couches précédentes)

Au-delà de l’exploration visuelle, Dive calcule des métriques d’efficacité.

MétriqueDescriptionSeuil recommandé
efficiencyPourcentage d’espace utilisé efficacement≥ 90%
wastedBytesOctets gaspillés (fichiers dupliqués/supprimés)≤ 10 MB
userWastedPercentPourcentage d’espace gaspillé par les modifications utilisateur≤ 10%
Fenêtre de terminal
dive nginx:1.27.3-alpine --ci

Résultat :

Using default CI config
Image Source: docker://nginx:1.27.3-alpine
Extracting image from docker-engine... (this can take a while for large images)
Analyzing image...
efficiency: 99.1303 %
wastedBytes: 657611 bytes (658 kB)
userWastedPercent: 1.6763 %
Inefficient Files:
Count Wasted Space File Path
2 445 kB /etc/ssl/certs/ca-certificates.crt
3 160 kB /lib/apk/db/installed
3 49 kB /lib/apk/db/scripts.tar
2 1.5 kB /etc/passwd
2 1.0 kB /etc/group
2 547 B /etc/shadow
3 414 B /lib/apk/db/triggers
3 396 B /etc/apk/world
Results:
PASS: highestUserWastedPercent
SKIP: highestWastedBytes: rule disabled
PASS: lowestEfficiency
Result:PASS [Total:3] [Passed:2] [Failed:0] [Warn:0] [Skipped:1]

La section “Inefficient Files” montre les fichiers qui apparaissent dans plusieurs couches (dupliqués) ou qui ont été supprimés après avoir été ajoutés.

Dans l’exemple ci-dessus :

  • ca-certificates.crt apparaît 2 fois → 445 kB gaspillés
  • Les fichiers APK (installed, scripts.tar) sont modifiés à chaque apk add

Dive peut bloquer automatiquement les builds si l’image ne respecte pas les critères d’efficacité.

Créez un fichier .dive-ci ou .dive-ci.yaml à la racine de votre projet :

.dive-ci.yaml
rules:
# Efficacité minimale (ratio 0-1)
lowestEfficiency: 0.9
# Pourcentage max de gaspillage utilisateur (ratio 0-1)
highestUserWastedPercent: 0.1
# Octets max gaspillés (disabled = pas de limite)
highestWastedBytes: disabled
.gitlab-ci.yml
stages:
- build
- analyze
build-image:
stage: build
image: docker:27.5.1
services:
- docker:27.5.1-dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
analyze-image:
stage: analyze
image: wagoodman/dive:v0.13.1
services:
- docker:27.5.1-dind
variables:
DOCKER_HOST: tcp://docker:2375
script:
- dive $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --ci
allow_failure: false
.github/workflows/analyze.yml
name: Analyze Docker Image
on:
push:
branches: [main]
jobs:
analyze:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4.2.2
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Install Dive
run: |
DIVE_VERSION="0.13.1"
curl -fsSLO "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb"
sudo dpkg -i "dive_${DIVE_VERSION}_linux_amd64.deb"
- name: Analyze image
run: dive myapp:${{ github.sha }} --ci

Vous pouvez surcharger les règles sans fichier de configuration :

Fenêtre de terminal
dive myimage:1.0.0 --ci \
--lowestEfficiency 0.95 \
--highestUserWastedPercent 0.05 \
--highestWastedBytes 5MB

Pour intégrer les métriques dans vos outils de monitoring ou dashboards :

Fenêtre de terminal
dive nginx:1.27.3-alpine --json /tmp/dive-report.json

Le fichier JSON contient :

  • La liste des couches avec leurs fichiers
  • Les métriques d’efficacité
  • Les fichiers inefficaces identifiés

Exemple d’extraction avec jq :

Fenêtre de terminal
# Extraire les métriques globales
cat /tmp/dive-report.json | jq '{
efficiency: .image.efficiency,
sizeBytes: .image.sizeBytes,
wastedBytes: .image.inefficientBytes
}'

Dive supporte plusieurs sources d’images :

Fenêtre de terminal
dive myimage:1.0.0
# ou explicitement
dive docker://myimage:1.0.0
Fenêtre de terminal
dive podman://myimage:1.0.0
Fenêtre de terminal
# Exporter avec docker save
docker save myimage:1.0.0 -o myimage.tar
# Analyser l'archive
dive docker-archive://myimage.tar

Une fois les problèmes identifiés avec Dive, voici les actions correctives :

# ❌ Mauvais : 3 couches, fichiers APK dupliqués
RUN apk add curl
RUN apk add jq
RUN apk add git
# ✅ Bon : 1 couche, moins de gaspillage
RUN apk add --no-cache curl jq git
# ❌ Mauvais : le cache APK reste dans une couche précédente
RUN apk update
RUN apk add curl
RUN rm -rf /var/cache/apk/*
# ✅ Bon : tout dans la même couche
RUN apk add --no-cache curl
# Stage build
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# Stage runtime (image finale légère)
FROM alpine:3.20.6
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

Pour plus de techniques d’optimisation, consultez le guide Optimiser la taille des images.

Vérifiez que Docker est démarré et que l’utilisateur a les permissions :

Fenêtre de terminal
# Vérifier le daemon
docker info
# Ajouter l'utilisateur au groupe docker
sudo usermod -aG docker $USER
newgrp docker

L’image doit être présente localement. Téléchargez-la d’abord :

Fenêtre de terminal
docker pull nginx:1.27.3-alpine
dive nginx:1.27.3-alpine

Vérifiez que votre terminal supporte UTF-8 et les 256 couleurs :

Fenêtre de terminal
export TERM=xterm-256color
dive myimage:1.0.0

Dive ne trouve pas le socket Docker (macOS/Colima)

Section intitulée « Dive ne trouve pas le socket Docker (macOS/Colima) »
Fenêtre de terminal
export DOCKER_HOST="unix://${HOME}/.colima/default/docker.sock"
# ou pour Podman
export DOCKER_HOST="unix://${XDG_RUNTIME_DIR}/podman/podman.sock"
  • Interface TUI : dive <image> pour explorer visuellement les couches
  • Mode CI : dive <image> --ci pour validation automatique dans les pipelines
  • Efficacité ≥ 90% : seuil recommandé pour des images optimisées
  • Combiner les RUN : évite la duplication de fichiers entre couches
  • Multi-stage builds : séparent build et runtime pour des images légères

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.