# syntax=docker/dockerfile:1 FROM node:22-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npx prisma generate RUN npm run build FROM node:22-alpine AS runtime ENV NODE_ENV=production WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --omit=dev COPY --from=builder /app/dist ./dist COPY --from=builder /app/generated ./generated # schema.prisma, migrations/, seed.ts und prisma.config.ts: noetig fuer # `npm run migrate:deploy` und `npm run seed`, die der Container beim Start # selbst ausfuehrt (siehe CMD unten), bevor der Server Verbindungen annimmt. # tsconfig.json: ts-node (Laufzeit-Dependency, siehe package.json) braucht es, # um seed.ts direkt auszufuehren, ohne separaten Kompilierschritt. COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/prisma.config.ts ./prisma.config.ts COPY --from=builder /app/tsconfig.json ./tsconfig.json EXPOSE 3001 USER node # migrate deploy ist idempotent und nutzt einen DB-seitigen Advisory-Lock, # seed ist idempotent per Unique-Constraint auf User.email (siehe seed.ts) - # beides unproblematisch bei mehreren gleichzeitig startenden Pod-Replicas. CMD ["sh", "-c", "npm run migrate:deploy && npm run seed && node dist/main.js"]