# ============================================ # Stage 1: Dependencies Installation # ============================================ FROM node:20-alpine AS deps WORKDIR /app # Install libc6-compat for compatibility RUN apk add --no-cache libc6-compat # Copy dependency files COPY package.json package-lock.json* ./ # Install dependencies with legacy peer deps flag for Next.js 16 RUN npm ci --legacy-peer-deps # ============================================ # Stage 2: Build Stage # ============================================ FROM node:20-alpine AS builder WORKDIR /app # Copy dependencies from deps stage COPY --from=deps /app/node_modules ./node_modules # Copy all source files COPY . . # Disable Next.js telemetry ENV NEXT_TELEMETRY_DISABLED=1 # Build the application RUN npm run build # ============================================ # Stage 3: Development Environment (Default) # ============================================ FROM node:20-alpine AS development WORKDIR /app # Set environment variables ENV NODE_ENV=development ENV NEXT_TELEMETRY_DISABLED=1 # Install libc6-compat for compatibility RUN apk add --no-cache libc6-compat curl # Copy dependencies from deps stage COPY --from=deps /app/node_modules ./node_modules # Copy source code (will be overridden by volume mount in docker-compose) COPY . . # Expose Next.js default port EXPOSE 3000 # Use turbo mode for faster development CMD ["npm", "run", "dev"] # ============================================ # Stage 4: Production Environment # ============================================ FROM node:20-alpine AS production WORKDIR /app # Set environment variables ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Install libc6-compat RUN apk add --no-cache libc6-compat # Create non-privileged user for security RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 nextjs # Copy build artifacts from builder stage 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 # Switch to non-privileged user USER nextjs # Expose port EXPOSE 3000 # Start the standalone server CMD ["node", "server.js"]