# syntax=docker/dockerfile:1 # ---------- Basis ---------- FROM node:24-alpine AS basis WORKDIR /app # tini beendet Prozesse sauber, openssl wird fuer die Geheimnis-Erzeugung gebraucht. RUN apk add --no-cache tini openssl ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 RUN corepack enable pnpm # ---------- Abhaengigkeiten ---------- FROM basis AS abhaengigkeiten # pnpm-workspace.yaml muss mit, sonst blockiert pnpm 12 die erlaubten Build-Skripte. COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY prisma ./prisma COPY prisma.config.ts ./ RUN pnpm install --frozen-lockfile # ---------- Bauen ---------- FROM abhaengigkeiten AS bauen ARG APP_VERSION=0.0.0 ARG GIT_SHA="" ENV NEXT_PUBLIC_APP_VERSION=$APP_VERSION ENV NEXT_PUBLIC_GIT_SHA=$GIT_SHA COPY . . RUN pnpm exec prisma generate && pnpm build # ---------- Laufzeit ---------- FROM basis AS laufzeit ENV NODE_ENV=production ENV PORT=3000 ENV HOSTNAME=0.0.0.0 RUN addgroup -g 1001 -S laufzettel && adduser -S laufzettel -u 1001 -G laufzettel COPY --from=bauen --chown=laufzettel:laufzettel /app/.next/standalone ./ COPY --from=bauen --chown=laufzettel:laufzettel /app/.next/static ./.next/static COPY --from=bauen --chown=laufzettel:laufzettel /app/public ./public USER laufzettel EXPOSE 3000 ENTRYPOINT ["/sbin/tini", "--"] CMD ["node", "server.js"]