Mehrstufige Docker-Builds für Go
Builder-Stufe und finales scratch-/alpine-Image
Mehrstufige Docker-Builds für Go ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum mehrere Build-Stufen?
Ein einstufiger Build, der Go-Code kompiliert, erzeugt ein großes Image mit der vollständigen Go-Toolchain. Bei mehrstufigen Builds wird in einer Stufe kompiliert und nur die Binärdatei in ein minimales finales Image kopiert.
Einfaches mehrstufiges Dockerfile
Die Build-Stufe kompiliert die Binärdatei; die finale Stufe kopiert sie in ein minimales Basisimage:
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
Ein FROM scratch-Image enthält nichts — keine Shell und keine Betriebssystembibliotheken. Die Go-Binärdatei muss statisch gelinkt sein (CGO_ENABLED=0) und alle benötigten Dateien müssen explizit eingebunden werden.
FROM distroless
Googles distroless-Images stellen minimale Betriebssystembibliotheken (CA-Zertifikate, Zeitzonendaten) ohne Shell bereit — sie sind für Binärdateien, die libc oder TLS-Zertifikate benötigen, sicherer als scratch.
FROM gcr.io/distroless/static-debian12
COPY --from=build /app/myapp /
ENTRYPOINT ["/myapp"]FROM alpine für eine Shell
Verwenden Sie Alpine als finales Basisimage, wenn Sie eine Shell zum Debuggen benötigen oder die Binärdatei CGO verwendet. Alpine fügt etwa 5 MB hinzu, enthält aber eine Shell und einen Paketmanager.
Layer-Caching für go.mod
Kopieren Sie go.mod und go.sum zuerst und führen Sie go mod download aus, bevor Sie den Quellcode kopieren. Diese Layer werden zwischengespeichert, bis sich die Abhängigkeiten ändern, wodurch Neubuilds schneller werden.
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build ...-ldflags="-s -w"
-s entfernt die Symboltabelle; -w entfernt die DWARF-Debuginformationen. Zusammen reduzieren sie die Größe der Binärdatei um 30–50 %, ohne Auswirkungen auf die Laufzeit.
Build-Argumente
Verwenden Sie ARG, um Versionsinformationen beim Build einzufügen:
ARG VERSION=dev
RUN go build -ldflags="-X main.version=${VERSION}" -o myapp .Nicht-Root-Benutzer
Führen Sie die Binärdatei aus Sicherheitsgründen als Benutzer ohne Root-Rechte aus. Fügen Sie in einem Basisimage einen Benutzer hinzu oder verwenden Sie das nonroot-Tag von distroless:
FROM gcr.io/distroless/static-debian12:nonrootGröße des finalen Images
Eine typische Go-Binärdatei aus scratch ist 5–20 MB groß. Alpine fügt etwa 5 MB hinzu. Ein vollständiges golang-Image ist etwa 800 MB groß. Mehrstufige Builds reduzieren die Angriffsfläche und die Zeit zum Herunterladen des Images erheblich.
.dockerignore
Fügen Sie eine .dockerignore-Datei hinzu, um Dateien aus dem Build-Kontext auszuschließen: vendor/, .git/, *.test, *.prof. Dadurch wird der Docker-Build beschleunigt und verhindert, dass vertrauliche Dateien einbezogen werden.
.git
vendor
*.test
*.prof
.envSchnelltest
Warum muss CGO_ENABLED=0 gesetzt werden, wenn Sie eine Go-Binärdatei für ein Docker-Image mit FROM scratch erstellen?
Zusammenfassung: Mehrstufige Docker-Builds
Wichtige Punkte:
- Build-Stufe: golang-Image; finale Stufe: scratch/distroless/alpine
- CGO_ENABLED=0 für eine statische Binärdatei (für scratch erforderlich)
- go.mod zuerst kopieren, um Layer-Caching zu nutzen; -ldflags="-s -w" für eine kleinere Binärdatei
- .dockerignore verwenden, um .git, vendor und Testdateien auszuschließen
Lerne Go mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Mehrstufige Docker-Builds für Go“ kostenlos?
Ja — der vollständige Text von „Mehrstufige Docker-Builds für Go“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Mehrstufige Docker-Builds für Go“?
Builder-Stufe und finales scratch-/alpine-Image Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Mehrstufige Docker-Builds für Go“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Mehrstufige Docker-Builds für Go
- Umgebungskonfiguration und Secrets
- Docker Compose für die lokale Entwicklung
- Health Checks und Tuning für Produktion