56 lines
2.4 KiB
Docker
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"]
|