Come utilizzi la build multi-stage per ottimizzare le immagini Docker?
sobes.tech AI
Risposta dell'AI
La compilazione multi-stage consente di utilizzare più fasi (layers) in un Dockerfile, dove ogni fase svolge il proprio compito. Il risultato di una fase (ad esempio, un artefatto compilato) viene passato alla fase successiva, ma gli strati intermedi delle fasi precedenti non vengono inclusi nell'immagine finale.
Esempio di utilizzo per compilare un'app Go:
# Fase di compilazione
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Fase finale
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Vantaggi:
- Riduzione delle dimensioni dell'immagine: Nell'immagine finale vengono inclusi solo l'app compilata e le dipendenze necessarie, non gli strumenti di compilazione, il codice sorgente o i file intermedi.
- Separazione delle responsabilità: La logica di compilazione/deploy è separata dalla logica di distribuzione.
- Maggiore sicurezza: Si riduce la superficie di attacco escludendo strumenti e librerie non necessari dall'immagine finale.
- Accelerazione delle compilazioni: La cache degli strati tra le fasi può velocizzare le ricompilazioni.
Ad esempio, nel Dockerfile fornito, il primo strato builder viene usato per compilare l'app Go. Il secondo strato, che inizia con FROM alpine:latest, copia solo l'app compilata dal primo strato (COPY --from=builder /app/myapp /app/) in un'immagine base pulita. Alla fine, l'immagine finale contiene solo il file eseguibile e il sistema operativo di base, senza il compilatore Go e il codice sorgente.
Questo riduce significativamente la dimensione dell'immagine rispetto all'approccio tradizionale, in cui la compilazione e l'esecuzione avvengono in un singolo contenitore.