Build Docker multi-stage per Go
Stage builder con immagine finale scratch/alpine
Build Docker multi-stage per Go è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
Perché usare più fasi?
Una build a fase singola che compila codice Go produce un'immagine di grandi dimensioni con l'intera toolchain Go. Le build a più fasi compilano in una fase e copiano solo il binario in un'immagine finale minimale.
Dockerfile di base a più fasi
La fase di build compila il binario; la fase finale lo copia in una base minimale:
FROM golang:1.22-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp ./cmd/server
FROM scratch
COPY --from=build /app/myapp /myapp
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/myapp"]FROM scratch
Un'immagine FROM scratch non contiene nulla: né shell né librerie del sistema operativo. Il binario Go deve essere collegato staticamente (CGO_ENABLED=0) e includere esplicitamente tutti i file necessari.
FROM distroless
Le immagini distroless di Google forniscono librerie OS minimali (certificati CA, dati dei fusi orari) senza shell: sono più sicure di scratch per i binari che richiedono libc o certificati TLS.
FROM gcr.io/distroless/static-debian12
COPY --from=build /app/myapp /
ENTRYPOINT ["/myapp"]FROM alpine per una shell
Utilizzi Alpine come base finale quando ha bisogno di una shell per il debug o se il binario usa CGO. Alpine aggiunge circa 5 MB, ma include una shell e un gestore di pacchetti.
Caching dei layer per go.mod
Copi prima go.mod e go.sum ed esegua go mod download prima di copiare il codice sorgente. Questo layer rimane nella cache finché le dipendenze non cambiano, velocizzando le ricompilazioni.
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build ...-ldflags="-s -w"
-s rimuove la tabella dei simboli; -w rimuove le informazioni di debug DWARF. Insieme riducono le dimensioni del binario del 30-50% senza alcun impatto a runtime.
Argomenti di build
Utilizzi ARG per inserire informazioni sulla versione al momento della build:
ARG VERSION=dev
RUN go build -ldflags="-X main.version=${VERSION}" -o myapp .Utente non root
Esegua il binario come utente non root per motivi di sicurezza. Aggiunga un utente nell'immagine di base oppure utilizzi il tag nonroot di distroless:
FROM gcr.io/distroless/static-debian12:nonrootDimensioni dell'immagine finale
Un tipico binario Go basato su scratch ha dimensioni di 5-20 MB. Alpine aggiunge circa 5 MB. Un'immagine golang completa occupa circa 800 MB. Le build a più fasi riducono significativamente la superficie di attacco e il tempo necessario per scaricare l'immagine.
.dockerignore
Aggiunga un .dockerignore per escludere file dal contesto di build: vendor/, .git/, *.test, *.prof. In questo modo la build Docker è più veloce e si impedisce l'inclusione di file sensibili.
.git
vendor
*.test
*.prof
.envVerifica rapida
Perché è necessario impostare CGO_ENABLED=0 quando si compila un binario Go per un'immagine Docker FROM scratch?
Riepilogo: build Docker a più fasi
Punti chiave:
- Fase di build: immagine golang; fase finale: scratch/distroless/alpine
- CGO_ENABLED=0 per un binario statico (necessario per scratch)
- Copiare prima go.mod per il caching dei layer; -ldflags="-s -w" per ridurre le dimensioni del binario
- .dockerignore per escludere .git, vendor e file di test
Domande Frequenti
La lezione «Build Docker multi-stage per Go» è gratuita?
Sì — il testo completo di «Build Docker multi-stage per Go» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «Build Docker multi-stage per Go»?
Stage builder con immagine finale scratch/alpine Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Build Docker multi-stage per Go»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Build Docker multi-stage per Go
- Configurazione dell'ambiente e segreti
- Docker Compose per lo sviluppo locale
- Health check e ottimizzazione per la produzione