Saltar al contenido principal

Dive

Herramienta para explorar cada capa de una imagen Docker, ver qué archivos se añaden/modifican/eliminan y detectar espacio desperdiciado.

Uso básico

# Explorar una imagen existente
dive nginx:latest
# Construir y explorar en un solo paso
dive build -t myapp:latest .

La interfaz tiene dos paneles principales:

  • Panel izquierdo — lista de capas (una por instrucción del Dockerfile)
  • Panel derecho — árbol de archivos de la capa seleccionada

Atajos de teclado

TeclaAcción
TabCambiar entre panel de capas y árbol de archivos
/ Navegar capas o archivos
SpaceExpandir/colapsar directorio
Ctrl+AMostrar solo archivos añadidos/modificados/eliminados
Ctrl+UOrdenar por tamaño
Ctrl+LMostrar atributos de la capa
Ctrl+CSalir

Análisis de eficiencia

Dive calcula automáticamente una puntuación de eficiencia y muestra:

  • Espacio potencialmente desperdiciado — archivos duplicados entre capas o eliminados en capas posteriores
  • Eficiencia de imagen — porcentaje de bytes útiles vs totales
# Obtener solo la puntuación de eficiencia (sin TUI)
dive nginx:latest --ci

Integración CI

Usar Dive en pipelines para rechazar imágenes ineficientes.

# Falla si la eficiencia es menor al 90% o el espacio desperdiciado supera 50MB
CI=true dive myapp:latest \
--lowestEfficiency 0.90 \
--highestWastedBytes 50000000

GitHub Actions

name: Dive image analysis
on:
pull_request:
push: { branches: [ main ] }

jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Install Dive
run: |
DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -OL "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"
- name: Analyze image
run: CI=true dive myapp:${{ github.sha }} --lowestEfficiency 0.90

Configuración con .dive-ci

Crear .dive-ci en la raíz del repo para definir umbrales por defecto:

rules:
lowestEfficiency: 0.90
highestWastedBytes: 50000000
highestUserWastedPercent: 0.10
# Dive usa .dive-ci automáticamente en modo CI
CI=true dive myapp:latest

Casos de uso en seguridad

  • Detectar secretos filtrados — revisar archivos añadidos en capas intermedias (tokens, llaves SSH, .env) que luego se eliminan pero siguen presentes en la imagen
  • Auditar imagen base — verificar qué paquetes y archivos trae la imagen base vs lo que añade tu Dockerfile
  • Validar multi-stage builds — confirmar que artefactos de compilación no se copian al stage final

Errores comunes

  • Imagen no encontrada — Dive busca en el daemon local. Si usas un registry remoto, haz docker pull primero.
  • No funciona con Podman — usa --source podman o exporta con podman save y analiza el tar: dive --source docker-archive myimage.tar.

Referencias