# syntax=docker/dockerfile:1 # ---- deps: install with a cached pnpm store ---- FROM node:24-alpine AS deps ENV PNPM_HOME=/pnpm PATH=/pnpm:$PATH RUN corepack enable WORKDIR /app COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile # ---- build ---- FROM node:24-alpine AS build ENV PNPM_HOME=/pnpm PATH=/pnpm:$PATH NEXT_TELEMETRY_DISABLED=1 RUN corepack enable WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . # Umami is read at build time (pages are prerendered), so pass these as build args. ARG PUBLIC_UMAMI_SCRIPT_URL ARG PUBLIC_UMAMI_WEBSITE_ID ENV PUBLIC_UMAMI_SCRIPT_URL=$PUBLIC_UMAMI_SCRIPT_URL \ PUBLIC_UMAMI_WEBSITE_ID=$PUBLIC_UMAMI_WEBSITE_ID RUN pnpm build # ---- runtime: standalone server only ---- FROM node:24-alpine AS runner ENV NODE_ENV=production NEXT_TELEMETRY_DISABLED=1 PORT=3000 HOSTNAME=0.0.0.0 # Only `node` is needed at runtime; drop npm/yarn/corepack. RUN rm -rf /usr/local/lib/node_modules /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack /opt/yarn-* WORKDIR /app COPY --from=build --chown=node:node /app/.next/standalone ./ COPY --from=build --chown=node:node /app/.next/static ./.next/static COPY --from=build --chown=node:node /app/public ./public USER node EXPOSE 3000 CMD ["node", "server.js"]