Files
proxmox-ha-setup/vm1/DOCKERFILE_COMPARISON.md
2025-11-29 19:51:15 +01:00

4.7 KiB

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

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

  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

# 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