# syntax=docker/dockerfile:1.7 # -------- deps -------- FROM node:20-alpine AS deps RUN apk add --no-cache libc6-compat openssl WORKDIR /app COPY package.json package-lock.json* ./ COPY prisma ./prisma RUN --mount=type=cache,target=/root/.npm npm ci --legacy-peer-deps # -------- build -------- FROM node:20-alpine AS builder RUN apk add --no-cache libc6-compat openssl WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . ENV NEXT_TELEMETRY_DISABLED=1 # Generate prisma client; skip migrate during build (no DB yet). RUN npx prisma generate RUN npm run build # -------- runner -------- FROM node:20-alpine AS runner RUN apk add --no-cache libc6-compat openssl WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV PORT=3000 RUN addgroup --system --gid 1001 nodejs \ && adduser --system --uid 1001 nextjs \ && mkdir -p /app/data \ && chown -R nextjs:nodejs /app # Standalone output bundles only what's needed. COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static COPY --from=builder --chown=nextjs:nodejs /app/public ./public # Prisma needs the schema + engines + CLI for migrate deploy at startup. COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma 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/node_modules/.bin/prisma* ./node_modules/.bin/ COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma COPY --from=builder --chown=nextjs:nodejs /app/node_modules/bcryptjs ./node_modules/bcryptjs COPY --from=builder --chown=nextjs:nodejs /app/node_modules/tsx ./node_modules/tsx COPY --from=builder --chown=nextjs:nodejs /app/node_modules/esbuild ./node_modules/esbuild COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@esbuild ./node_modules/@esbuild COPY --from=builder --chown=nextjs:nodejs /app/node_modules/get-tsconfig ./node_modules/get-tsconfig COPY --from=builder --chown=nextjs:nodejs /app/node_modules/resolve-pkg-maps ./node_modules/resolve-pkg-maps COPY docker/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh USER nextjs EXPOSE 3000 VOLUME ["/app/data"] ENTRYPOINT ["/entrypoint.sh"] CMD ["node", "server.js"]