# 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 # 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 RUN apk update && apk upgrade --no-cache # Non-Root User anlegen # RUN addgroup -S appgroup # RUN adduser -S appuser -G appgroup # Verzeichnis für Ausgabe anlegen RUN mkdir -p /output # Dem User die Rechte für die Ordner /app und /output geben # RUN chown -R appuser:appgroup /app /output # nur die fertige Binärdatei aus der "builder"-Stage kopieren COPY --from=builder /build/deployment /app/ # COPY --from=builder --chown=appuser:appgroup /build/deployment /app/ # 3. Data Volume für die Ausgabe mounten VOLUME ["/output"] # 4. Ab hier läuft alles als sicherer Non-Root User # USER appuser # 5. Healthcheck implementieren # Da das C-Programm alle 10 Sekunden etwas schreibt, prüfen wir alle 15 Sekunden, # ob die Datei "/output/ausgabe.log" existiert und Daten enthält (-s). # HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \ # CMD test -s /output/ausgabe.log || exit 1 # 6. Startbefehl # Wir starten das Programm (Intervall: 10 Sekunden) und hängen die Ausgabe (>>) an die Datei im Volume an. # (Dein C-Code nutzt netterweise schon fflush(stdout), was perfekt für diese Umleitung ist!) # CMD ["sh", "-c", "/app/deployment 10 >> /output/ausgabe.log"] # Ausgabe wird ins Container-Dateisystem geschrieben ENTRYPOINT ["/bin/bash", "-c"] CMD ["./deployment 10 > /output/output.txt && tail -f /output/output.txt"]