# 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"]