# Build stage FROM node:20-alpine AS builder WORKDIR /app # Copy package files COPY package.json pnpm-lock.yaml ./ # Install pnpm RUN npm install -g pnpm # Install dependencies (skip build scripts - sharp will use wasm fallback) RUN pnpm install --frozen-lockfile --ignore-scripts # Copy source COPY . . # Build Next.js app RUN pnpm run build # Production stage FROM node:20-alpine WORKDIR /app # Install dumb-init for proper signal handling RUN apk add --no-cache dumb-init # Create non-root user RUN addgroup -g 1001 -S nodejs && \ adduser -S nextjs -u 1001 # Copy built app from builder 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 USER nextjs EXPOSE 3000 ENV NODE_ENV=production ENTRYPOINT ["dumb-init", "--"] CMD ["node", "server.js"]