# Confronto Dockerfile: Standard vs Distroless ## File Disponibili 1. **`Dockerfile`** - Versione standard con `python:3.12-slim` 2. **`Dockerfile.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 ```bash 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 ```bash 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) ```dockerfile FROM python:3.12-slim AS builder # Installa dipendenze # Compila bytecode # Rimuove .py ``` ### Stage 2: Runtime (distroless) ```dockerfile 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 ```bash docker exec -it container bash # No shell! docker exec -it container sh # No shell! ``` ### ✅ Funziona ```bash # 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 ```bash # docker-compose.yml services: orchestrator: build: context: . dockerfile: Dockerfile # ← Standard ``` ### Per usare Distroless ```bash # 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 1. **Volumi**: Funzionano ugualmente in entrambe le versioni 2. **Network**: Nessuna differenza 3. **ENV vars**: Funzionano ugualmente 4. **CMD/ENTRYPOINT**: Funzionano ugualmente 5. **Logs**: Funzionano ugualmente (STDOUT/STDERR) ## Build & Test ```bash # 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 ```