# STAGE 1: Builder FROM alpine:3.23 AS builder # Pakete installieren (gcc & Standardbibliotheken) RUN apk add --no-cache gcc musl-dev # Arbeitsverzeichnis für den Build-Prozess WORKDIR /build # nur C-Code kopieren COPY deployment.c . # Code kompilieren (-O2 optimiert die Performance der Binärdatei) RUN gcc -O2 -o deployment deployment.c # STAGE 2: Runner FROM alpine:3.23 # Arbeitsverzeichnis setzen WORKDIR /app # OPTIMIERUNG: System-Update durchführen, um CVEs zu fixen # 'apk upgrade' installiert die Version 3.3.7-r0 von OpenSSL # Non-Root User anlegen # Verzeichnis für Ausgabe anlegen # Dem User die Rechte für die Ordner /app und /output geben RUN apk update && apk upgrade --no-cache && \ addgroup -S -g 1000 appgroup && \ adduser -S -u 1000 -G appgroup appuser && \ mkdir -p /output && \ chown -R 1000:1000 /app /output # nur die fertige Binärdatei aus der "builder"-Stage kopieren COPY --from=builder --chown=1000:1000 /build/deployment /app/ # 3. Ab hier läuft alles als sicherer Non-Root User USER 1000 # 4. Data Volume für die Ausgabe mounten (um lokal die output.txt zu sehen) VOLUME ["/output"] # 5. Healthcheck # Da das C-Programm alle 10 Sekunden etwas schreibt, prüfen wir alle 15 Sekunden, # ob die Datei "/output/output.txt" existiert und Daten enthält (-s). HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \ CMD test -s /output/output.txt || exit 1 # 6. Startbefehl ENTRYPOINT ["/bin/sh", "-c"] CMD ["./deployment 10 > /output/output.txt && tail -f /output/output.txt"]