33 lines
1.4 KiB
Docker
33 lines
1.4 KiB
Docker
# 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"]
|