# Docker lädt ein fertiges Image mit Linux Alpine und Node.js Version 20.
# Alpine ist eine sehr kleine Linux-Distribution — kleineres Image, schnellere Downloads.
FROM node:20-alpine

# Docker erstellt Verzeichnis /app falls noch nicht vorhanden.
# Alle folgenden Befehle laufen in diesem Verzeichnis.
WORKDIR /app

# Zuerst nur package.json kopieren — noch nicht den ganzen Code.
# Warum: Docker cached jeden Schritt. Wenn sich nur der Code ändert aber nicht die
# Dependencies, muss npm ci nicht nochmal laufen — Build wird schneller (Layer Caching).
COPY package*.json ./

# npm ci installiert exakt die Versionen aus package-lock.json — reproduzierbarer Build.
# --omit=dev: Keine Entwicklungs-Dependencies in Produktion — kleineres und sichereres Image.
RUN npm ci --omit=dev

# Jetzt erst den restlichen Code kopieren — nach npm ci damit der Cache optimal genutzt wird.
COPY . .

# NODE_ENV=production aktiviert Optimierungen in Express (z.B. bessere Performance, weniger Logs).
# PORT=4000 definiert auf welchem Port der Server lauscht.
ENV NODE_ENV=production
ENV PORT=4000

# Dokumentiert welchen Port der Container verwendet — öffnet ihn aber nicht wirklich.
# Das passiert in docker-compose.yml.
EXPOSE 4000

# Startbefehl wenn der Container läuft.
# Array-Form statt String damit Node.js direkt als Prozess gestartet wird — kein Shell-Prozess dazwischen.
CMD ["node", "index.js"]
