go-wiki/Dockerfile
2026-07-14 20:46:19 +02:00

56 lines
2.4 KiB
Docker

# ── 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"]