# ---------- deps ---------- FROM node:20-alpine AS deps # helps certain native packages (e.g., sharp) on Alpine RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json package-lock.json* pnpm-lock.yaml* yarn.lock* ./ # install with your lockfile manager RUN if [ -f pnpm-lock.yaml ]; then npm i -g pnpm@8 && pnpm i --frozen-lockfile; \ elif [ -f yarn.lock ]; then yarn install --frozen-lockfile; \ else npm ci; fi # ---------- builder ---------- FROM node:20-alpine AS builder WORKDIR /app ENV NEXT_TELEMETRY_DISABLED=1 COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build # ---------- runner ---------- FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production # non-root user RUN addgroup -g 1001 nodejs && adduser -u 1001 -G nodejs -s /bin/sh -D nextjs # copy the minimal standalone output COPY --from=builder /app/public ./public COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static USER nextjs ENV PORT=3000 ENV HOSTNAME=0.0.0.0 EXPOSE 3000 CMD ["node", "server.js"]