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 .
Navegación interactiva
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
| Tecla | Acción |
|---|---|
Tab | Cambiar entre panel de capas y árbol de archivos |
↑ / ↓ | Navegar capas o archivos |
Space | Expandir/colapsar directorio |
Ctrl+A | Mostrar solo archivos añadidos/modificados/eliminados |
Ctrl+U | Ordenar por tamaño |
Ctrl+L | Mostrar atributos de la capa |
Ctrl+C | Salir |
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 pullprimero. - No funciona con Podman — usa
--source podmano exporta conpodman savey analiza el tar:dive --source docker-archive myimage.tar.