Dockerfile (1877B)
1 # syntax=docker.io/docker/dockerfile:1 2 3 FROM node:23-alpine AS base 4 5 # Install dependencies only when needed 6 FROM base AS deps 7 # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. 8 RUN apk add --no-cache libc6-compat 9 WORKDIR /app 10 11 # Install dependencies based on the preferred package manager 12 COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ 13 RUN \ 14 if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ 15 elif [ -f package-lock.json ]; then npm ci; \ 16 elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ 17 else echo "Lockfile not found." && exit 1; \ 18 fi 19 20 21 # Rebuild the source code only when needed 22 FROM base AS builder 23 WORKDIR /app 24 COPY --from=deps /app/node_modules ./node_modules 25 COPY . . 26 27 ENV NEXT_TELEMETRY_DISABLED=1 28 29 RUN \ 30 if [ -f yarn.lock ]; then yarn run build; \ 31 elif [ -f package-lock.json ]; then npm run build; \ 32 elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ 33 else echo "Lockfile not found." && exit 1; \ 34 fi 35 36 # Production image, copy all the files and run next 37 FROM base AS runner 38 WORKDIR /app 39 40 ENV NODE_ENV=production 41 ENV NEXT_TELEMETRY_DISABLED=1 42 43 RUN addgroup --system --gid 1001 nodejs 44 RUN adduser --system --uid 1001 nextjs 45 46 COPY --from=builder /app/public ./public 47 48 # Automatically leverage output traces to reduce image size 49 # https://nextjs.org/docs/advanced-features/output-file-tracing 50 COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ 51 COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static 52 53 USER nextjs 54 55 EXPOSE 3000 56 57 ENV PORT=3000 58 59 # server.js is created by next build from the standalone output 60 # https://nextjs.org/docs/pages/api-reference/config/next-config-js/output 61 ENV HOSTNAME="0.0.0.0" 62 CMD ["node", "server.js"]