# ───────────────────────────────────────────── # Stage 1: Build # ───────────────────────────────────────────── FROM node:22-alpine AS builder WORKDIR /app # Erst nur package*.json – besseres Layer-Caching COPY package*.json ./ # prepare läuft svelte-kit sync (|| true → unkritisch wenn Config fehlt) RUN npm ci COPY . . RUN npm run build # ───────────────────────────────────────────── # Stage 2: Schlankes Production-Image # ───────────────────────────────────────────── FROM node:22-alpine AS runner WORKDIR /app ENV NODE_ENV=production # Nur Production-Deps, kein postinstall nötig COPY package*.json ./ RUN npm ci --omit=dev --ignore-scripts # Build-Artefakt aus Stage 1 COPY --from=builder /app/build ./build # Non-root user RUN addgroup -g 1001 -S nodejs \ && adduser -S svelte -u 1001 -G nodejs \ && chown -R svelte:nodejs /app USER svelte EXPOSE 3001 ENV PORT=3001 HEALTHCHECK --interval=5s --timeout=3s --start-period=15s --retries=3 \ CMD wget -qO- http://127.0.0.1:3001/ > /dev/null || exit 1 CMD ["node", "build"]