4.7 KiB
Confronto Dockerfile: Standard vs Distroless
File Disponibili
Dockerfile- Versione standard conpython:3.12-slimDockerfile.distroless- Versione con immagine distroless
Dockerfile Standard (python:3.12-slim)
Vantaggi
✅ Più semplice da gestire
✅ Include shell e tool di sistema
✅ Facile debugging (puoi fare docker exec -it container bash)
✅ Compatibile con tutti i tool esistenti
✅ Build più veloce (single-stage)
Svantaggi
⚠️ Immagine più grande (~333MB) ⚠️ Più superficie d'attacco (shell, package manager, etc.) ⚠️ Include tool non necessari in produzione
Dimensione
- Base image: ~125MB
- Con dipendenze: ~333MB
Uso
docker build -t orchestrator-app:latest -f Dockerfile .
Dockerfile Distroless (gcr.io/distroless/python3-debian12)
Vantaggi
✅ Immagine molto più piccola (~180MB stimato) ✅ Massima sicurezza - niente shell, niente package manager ✅ Superficie d'attacco minimale ✅ Solo runtime Python e dipendenze ✅ Best practice per produzione
Svantaggi
⚠️ NO debugging - non puoi fare exec nel container ⚠️ Build più complesso (multi-stage) ⚠️ Richiede gestione attenta delle dipendenze ⚠️ Debugging solo tramite log
Caratteristiche
- Multi-stage build: compila in python:slim, copia in distroless
- Nessuna shell: impossibile fare
docker exec -it bash - Solo bytecode: i file .py sono rimossi anche dalle dipendenze
- Immutabile: modifiche solo ricostruendo l'immagine
Dimensione Stimata
- Base distroless: ~50MB
- Con dipendenze Python: ~180MB (risparmio ~150MB)
Uso
docker build -t orchestrator-app:distroless -f Dockerfile.distroless .
Confronto Tecnico
| Caratteristica | Standard | Distroless |
|---|---|---|
| Base image | python:3.12-slim | distroless/python3 |
| Dimensione | ~333MB | ~180MB |
| Shell | ✅ Si | ❌ No |
| Debug exec | ✅ Si | ❌ No |
| Package manager | ✅ Si | ❌ No |
| Sicurezza | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Complessità | Semplice | Media |
| Build stages | 1 | 2 |
| Debugging | Facile | Solo log |
| Produzione | ✅ OK | ✅ Ideale |
Come Funziona il Multi-Stage Build (Distroless)
Stage 1: Builder (python:3.12-slim)
FROM python:3.12-slim AS builder
# Installa dipendenze
# Compila bytecode
# Rimuove .py
Stage 2: Runtime (distroless)
FROM gcr.io/distroless/python3-debian12
# Copia SOLO:
# - Dipendenze compilate
# - File .pyc
# - File statici (certs, env)
Risultato: Immagine finale ha solo Python runtime + bytecode, niente altro!
Quando Usare Quale?
Usa Dockerfile Standard se:
- ✅ Sviluppo e testing locale
- ✅ Hai bisogno di debugging interattivo
- ✅ Vuoi semplicità
- ✅ La dimensione non è critica
Usa Dockerfile.distroless se:
- ✅ Deploy in produzione
- ✅ Massima sicurezza è prioritaria
- ✅ Vuoi ridurre la superficie d'attacco
- ✅ Dimensione immagine è importante
- ✅ Hai buoni log e monitoring
Debugging con Distroless
Dato che non c'è shell, il debugging è diverso:
❌ Non Funziona
docker exec -it container bash # No shell!
docker exec -it container sh # No shell!
✅ Funziona
# Usa i log
docker logs container -f
# Usa debug image temporanea (per sviluppo)
FROM gcr.io/distroless/python3-debian12:debug # Include busybox
# Debug da fuori
docker cp container:/app/logs/error.log .
Cambio tra le Due Versioni
Per usare Standard
# docker-compose.yml
services:
orchestrator:
build:
context: .
dockerfile: Dockerfile # ← Standard
Per usare Distroless
# docker-compose.yml
services:
orchestrator:
build:
context: .
dockerfile: Dockerfile.distroless # ← Distroless
Raccomandazione
Sviluppo
Usa Dockerfile (standard) per facilità di debug
Staging
Testa Dockerfile.distroless per validare
Produzione
Usa Dockerfile.distroless per sicurezza e dimensione
Note Importanti
- Volumi: Funzionano ugualmente in entrambe le versioni
- Network: Nessuna differenza
- ENV vars: Funzionano ugualmente
- CMD/ENTRYPOINT: Funzionano ugualmente
- Logs: Funzionano ugualmente (STDOUT/STDERR)
Build & Test
# Build standard
docker build -t orchestrator:standard -f Dockerfile .
# Build distroless
docker build -t orchestrator:distroless -f Dockerfile.distroless .
# Confronta dimensioni
docker images | grep orchestrator
# Test entrambe
docker run --rm orchestrator:standard python --version
docker run --rm orchestrator:distroless python --version