# Multi-stage Dockerfile for Next.js CMS # Stage 1: Build FROM node:20-alpine AS builder WORKDIR /app # Copy package files COPY package.json pnpm-lock.yaml ./ # Install dependencies RUN npm install -g pnpm && pnpm install --frozen-lockfile # Copy source code COPY . . ARG DATABASE_URL="postgresql://dummy:dummy@localhost:5432/dummy" ENV DATABASE_URL=$DATABASE_URL # Generate Prisma client RUN pnpm exec prisma generate # Build Next.js application RUN npm run build # Stage 2: Production Runtime FROM node:20-alpine WORKDIR /app # Install dumb-init for proper signal handling RUN apk add --no-cache dumb-init # Copy from builder: node_modules and .next build output COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./package.json # Set production environment ENV NODE_ENV=production # Expose port 3000 EXPOSE 3000 # Use dumb-init to handle signals properly ENTRYPOINT ["dumb-init", "--"] # Start Next.js production server CMD ["npm", "run", "start"]