From 69ef92e42fc974472f1f2bf000b2dc71b0e6740c Mon Sep 17 00:00:00 2001 From: Tobias Niegratschka Date: Sat, 11 Apr 2026 11:40:26 +0000 Subject: [PATCH] Dockerfile aktualisiert --- Dockerfile | 71 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index a5cdf64..df7eeb9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,65 @@ -# Base-Image -FROM ubuntu:latest +# ========================================== +# STAGE 1: Die Build-Umgebung (Der Compiler) +# ========================================== +# Wir nutzen Debian-Slim, ein schlankeres Linux, +# installieren aber die notwendigen Compiler. +FROM debian:stable-slim AS builder -# Pakete installieren -RUN apt-get update -RUN apt-get install -y build-essential gcc curl vim net-tools +# Installiere NUR build-essential und gcc, die wir zum Kompilieren brauchen. +# rm -rf räumt den Paket-Cache direkt auf, um Platz in den Layern zu sparen. +RUN apt-get update && apt-get install -y \ + build-essential \ + gcc \ + && rm -rf /var/lib/apt/lists/* -# Arbeitsverzeichnis setzen +# Arbeitsverzeichnis für den Bau +WORKDIR /build + +# Kopiere NUR die Quelldatei deployment.c +COPY deployment.c . + +# Kompiliere das Programm. +# Das Flag -static ist WICHTIG, damit das Programm alle Bibliotheken +# in sich trägt und auch auf minimalen Images wie Alpine läuft. +RUN gcc -o deployment deployment.c -static + + +# ========================================== +# STAGE 2: Das Runtime-Image (Das fertige Produkt) +# ========================================== +# Wir starten GANZ NEU mit Alpine Linux (ca. 5 MB klein!) +FROM alpine:latest + +# Metadaten hinzufügen +LABEL maintainer="dein-name@stud.th-nuernberg.de" + +# 1. Non-Root User anlegen (Sicherheit!) +# Wir legen eine Gruppe und einen User an, unter dem die App laufen wird. +RUN addgroup -S appgroup && adduser -S appuser -G appgroup + +# 2. Arbeitsverzeichnis und Mount-Point vorbereiten WORKDIR /app +# Erstelle das /output Verzeichnis IM Container und übergebe die Rechte an appuser +RUN mkdir /output && chown appuser:appgroup /output -# alles kopieren -COPY . . +# 3. Kopiere NUR das fertige Binary aus der Builder-Stage +# Wir holen nur die Datei /build/deployment aus Stage 1. +# Der GCC-Compiler und das Debian-System bleiben zurück und werden gelöscht. +COPY --from=builder /build/deployment . +# Rechte anpassen +RUN chown appuser:appgroup deployment -# Code kompilieren -RUN gcc -o deployment deployment.c +# Wechsel zum Non-Root User +USER appuser -# Verzeichnis für Ausgabe anlegen -RUN mkdir /output +# 4. Datavolume definieren (Mount-Point) +VOLUME ["/output"] -# Ausgabe wird ins Container-Dateisystem geschrieben -ENTRYPOINT ["/bin/bash", "-c"] +# 5. HEALTHCHECK implementieren +# Wir prüfen alle 30s, ob die App überhaupt läuft. +HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \ + CMD pgrep deployment || exit 1 + +# Startbefehl anpassen (für sh statt bash, was in alpine standard ist) +ENTRYPOINT ["/bin/sh", "-c"] CMD ["./deployment 10 > /output/output.txt && tail -f /output/output.txt"] \ No newline at end of file