# Build stage FROM node:22-alpine AS builder WORKDIR /app # Install system deps for Prisma RUN apk add --no-cache libc6-compat openssl # Copy package manifest first (better layer caching) COPY nextjs_space/package.json.docker ./package.json # Reproducible, faster install (omits devDeps in production) RUN npm ci # Copy source code COPY nextjs_space/app ./app COPY nextjs_space/lib ./lib COPY nextjs_space/components ./components COPY nextjs_space/prisma ./prisma COPY nextjs_space/public ./public COPY nextjs_space/next.config.js ./ COPY nextjs_space/tailwind.config.ts ./ COPY nextjs_space/tsconfig.json ./ COPY nextjs_space/postcss.config.js ./ COPY nextjs_space/next-env.d.ts ./ COPY nextjs_space/components.json ./ # Generate Prisma client RUN npx prisma generate # Build the application ENV NEXT_TELEMETRY_DISABLED=1 ENV NEXT_OUTPUT_MODE=standalone RUN npm run build # ── Production stage ───────────────────────────────────────────────────────── FROM node:22-alpine AS runner WORKDIR /app # Install OpenSSL for Prisma RUN apk add --no-cache libc6-compat openssl ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Non-root user for security RUN addgroup --system --gid 1001 nodejs \ && adduser --system --uid 1001 nextjs # Copy built assets COPY --from=builder /app/public ./public COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma # Copy startup script COPY start.sh ./ RUN chmod +x start.sh USER nextjs EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" CMD ["./start.sh"]