209 lines
4.7 KiB
Markdown
209 lines
4.7 KiB
Markdown
# 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
|
|
```
|