65 lines
2.8 KiB
Docker
65 lines
2.8 KiB
Docker
# ---------- Build-Stage ----------
|
|
# Debian statt Alpine: Prisma 5.x erkennt hier die OpenSSL-3-Engine
|
|
# (debian-openssl-3.0.x) zuverlaessig. Auf aktuellen Alpine-Versionen
|
|
# (OpenSSL >= 3.5) faellt Prisma auf die nicht verfuegbare 1.1-Engine
|
|
# zurueck und der Client kann nicht initialisiert werden.
|
|
FROM node:20-bookworm-slim AS builder
|
|
WORKDIR /app
|
|
|
|
COPY package.json package-lock.json ./
|
|
# ci statt install: reproduzierbarer Build aus dem Lockfile
|
|
RUN npm ci
|
|
|
|
# openssl-Binary: Prisma nutzt es zur Erkennung der Engine-Version.
|
|
# Ohne dieses Binary faellt Prisma auf debian-openssl-1.1.x zurueck,
|
|
# dessen Engine auf Bookworm (OpenSSL 3) nicht ladbar ist.
|
|
RUN apt-get update -y \
|
|
&& apt-get install -y --no-install-recommends openssl \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
COPY prisma ./prisma
|
|
RUN npx prisma generate
|
|
|
|
COPY . .
|
|
RUN npm run build
|
|
|
|
# ---------- Runtime-Stage ----------
|
|
FROM node:20-bookworm-slim AS runner
|
|
WORKDIR /app
|
|
ENV NODE_ENV=production
|
|
ENV HOSTNAME=0.0.0.0
|
|
ENV PORT=3000
|
|
|
|
# openssl auch zur Laufzeit: die Prisma-CLI (migrate deploy) nutzt es
|
|
# zur Engine-Erkennung; ohne Binary sucht sie die 1.1.x-Engine und failt.
|
|
RUN apt-get update -y \
|
|
&& apt-get install -y --no-install-recommends openssl \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
RUN addgroup --system nodejs && adduser --system --ingroup nodejs nextjs
|
|
|
|
COPY --from=builder /app/public ./public
|
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
|
|
# Prisma Client inkl. Query-Engine fuer den Laufzeit-Container
|
|
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma
|
|
# Prisma-CLI fuer "migrate deploy" beim Start (kein npx-Download zur Laufzeit)
|
|
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/prisma ./node_modules/prisma
|
|
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma
|
|
COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma
|
|
# bcryptjs fuer das Admin-Seed-Script (manuell ausfuehrbar, nicht beim Start)
|
|
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/bcryptjs ./node_modules/bcryptjs
|
|
|
|
USER nextjs
|
|
EXPOSE 3000
|
|
|
|
# Migrationen beim Start anwenden, optional Admin seeden, dann Server starten.
|
|
# prisma migrate deploy ist idempotent und sicher fuer wiederholte Starts.
|
|
# Das Seed-Script ist NICHT-destruktiv: Es legt den Admin nur an, wenn
|
|
# noch keiner existiert (First-Run-Detection). Bestehende User werden
|
|
# niemals geloescht. Wenn SEED_ADMIN_* nicht gesetzt sind, laeuft es
|
|
# ohne Nebeneffekte durch.
|
|
# Direkter node-Aufruf statt npx: im Standalone-Output existiert
|
|
# node_modules/.bin nicht, daher wuerde "npx prisma" mit "not found" fehlschlagen.
|
|
CMD ["sh", "-c", "node node_modules/prisma/build/index.js migrate deploy && node prisma/seed-admin.cjs && node server.js"] |