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