# ── Stage 1: Builder ────────────────────────────────────────────────────────── # Wir starten mit dem offiziellen Go-Image — es hat den Compiler und alle Tools. # Dieses Image ist groß (~800MB), aber es landet NICHT im finalen Container. FROM golang:1.26-alpine AS builder # Arbeitsverzeichnis im Container setzen (wie "cd /app") WORKDIR /app # Zuerst nur die Dependency-Dateien kopieren und installieren. # Warum zuerst nur diese? Docker cached jeden Schritt. Wenn sich nur der Code # ändert aber nicht go.mod/go.sum, muss Docker die Dependencies nicht neu laden. COPY go.mod go.sum ./ RUN go mod download # Jetzt den restlichen Code kopieren COPY . . # Das Binary kompilieren. # CGO_ENABLED=0 → kein C-Code, reines Go (nötig für Alpine Linux) # GOOS=linux → für Linux kompilieren (auch wenn wir auf Mac entwickeln) # -o wiki → Name des Output-Binaries RUN CGO_ENABLED=0 GOOS=linux go build -o wiki . # ── Stage 2: Runner ─────────────────────────────────────────────────────────── # Alpine ist ein minimales Linux — nur ~5MB. Kein Go-Compiler, keine Tools, # nur das nötigste Betriebssystem. FROM alpine:3.21 # git wird zur Laufzeit gebraucht — der Webhook-Handler führt "git pull" aus. # apk ist der Paketmanager von Alpine (wie apt bei Ubuntu). RUN apk add --no-cache git WORKDIR /app # Das fertige Binary aus dem Builder-Stage rüberkopieren. # Sonst nichts — kein Go, keine Source-Files, keine Dependencies. COPY --from=builder /app/wiki . # templates/ und static/ sind ins Binary eingebettet (//go:embed in main.go) # und müssen deshalb NICHT separat kopiert werden — das Binary ist selbst-contained. # Der docs-Ordner wird NICHT ins Image gepackt — er kommt als Volume-Mount. # Das bedeutet: neue Wiki-Seiten deployen = Datei hochladen, kein Rebuild nötig. # Port dokumentieren (macht den Port nicht automatisch erreichbar, ist nur Metadaten) EXPOSE 8080 # Umgebungsvariablen mit Standardwerten. # Diese können beim "docker run" mit -e überschrieben werden. ENV DOCS_ROOT=/data/docs ENV PORT=8080 # ADMIN_TOKEN wird beim Start gesetzt und hat keinen Standardwert — Pflichtfeld! # Den Server starten wenn der Container läuft CMD ["./wiki"]