build image

This commit is contained in:
2025-11-29 19:51:15 +01:00
parent c688eefe0b
commit a4b7d3c738
177 changed files with 2018 additions and 23366 deletions

View File

@@ -0,0 +1,208 @@
# 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
```