diff --git a/Dockerfile b/Dockerfile index 023aa8d..84870e9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,36 @@ -# Base-Image -FROM alpine - -# Pakete installieren -RUN apk update && apk upgrade -RUN apk add --no-cache build-base curl vim net-tools - -# Arbeitsverzeichnis setzen -WORKDIR /app - -# alles kopieren -COPY . . - -# Code kompilieren +# === STAGE 1: Die Bau-Umgebung (wird am Ende weggeworfen) === +FROM alpine:latest AS builder +RUN apk add --no-cache build-base +WORKDIR /build +COPY deployment.c . +# Hier wird die fertige, ausführbare Binärdatei erzeugt RUN gcc -o deployment deployment.c -# Verzeichnis für Ausgabe anlegen +# === STAGE 2: Die schlanke Laufzeit-Umgebung (das finale Image) === +FROM alpine:latest +WORKDIR /app + +# Nur das fertige C-Programm aus Stage 1 herüberkopieren (spart ~150MB!) +COPY --from=builder /build/deployment . + +# Verzeichnis für die Ausgabe anlegen RUN mkdir /output -# User hinzufügen -RUN adduser -D appuser +# Anforderung 1: Datavolume für die Ausgabe definieren +VOLUME /output + +# Anforderung 2 & 3: Nicht-Root-User anlegen & Schreibrechte für /output vergeben +RUN adduser -D appuser && chown -R appuser:appuser /app /output USER appuser -# Ausgabe wird ins Container-Dateisystem geschrieben -ENTRYPOINT ["/bin/bash", "-c"] -CMD ["./deployment 10 > /output/output.txt && tail -f /output/output.txt"] \ No newline at end of file +# Anforderung 4: Funktionsfähiger HEALTHCHECK +# Er prüft alle 10 Sekunden, ob das Programm die Datei erfolgreich beschreibt +HEALTHCHECK --interval=10s --timeout=3s \ + CMD test -f /output/output.txt || exit 1 + +# Da wir auf Alpine sind, nutzen wir /bin/sh (spart die Installation von bash) +ENTRYPOINT ["/bin/sh", "-c"] + +# Das '&' (statt '&&') sorgt dafür, dass das C-Programm im Hintergrund startet, +# damit das 'tail -f' im Vordergrund sofort anspringt und dem User Feedback gibt! +CMD ["./deployment 10 > /output/output.txt & tail -f /output/output.txt"] \ No newline at end of file