# ============================================================================= # Stage 1: Build # ============================================================================= FROM node:20-alpine AS builder WORKDIR /app # Install dependencies first (layer cache optimization) COPY package.json package-lock.json* ./ RUN npm ci --legacy-peer-deps # Copy source COPY . . # Build Next.js ENV NEXT_TELEMETRY_DISABLED=1 RUN npm run build # ============================================================================= # Stage 2: Runtime (minimal Node.js image) # ============================================================================= FROM node:20-alpine AS runtime # Install dumb-init for proper signal handling RUN apk add --no-cache dumb-init WORKDIR /app # Copy built artifacts from builder COPY --from=builder /app/.next .next COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./ COPY --from=builder /app/node_modules ./node_modules ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Non-root user for security RUN addgroup -g 1001 -S nodejs && \ adduser -S nextjs -u 1001 USER nextjs EXPOSE 3000 # Health check HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD wget -qO- http://localhost:3000/api/health || exit 1 ENTRYPOINT ["dumb-init", "--"] CMD ["node_modules/.bin/next", "start","-H", "0.0.0.0"]