# syntax=docker/dockerfile:1 # ---- Base image with pnpm enabled ---- FROM node:20-slim AS base WORKDIR /app ENV NEXT_TELEMETRY_DISABLED=1 \ PNPM_HOME=/usr/local/share/pnpm ENV PATH=${PNPM_HOME}:${PATH} RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates openssl \ && rm -rf /var/lib/apt/lists/* \ && corepack enable # ---- Install dependencies (cached layer) ---- FROM base AS deps COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile # ---- Build the Next.js application ---- FROM base AS builder ARG DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres" ARG NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="" ENV DATABASE_URL=${DATABASE_URL} \ NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=${NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY} COPY --from=deps /app/node_modules ./node_modules COPY . . RUN mkdir -p public RUN pnpm run prisma:generate RUN pnpm run build # ---- Prune devDependencies for the runtime image ---- FROM deps AS prod-deps RUN pnpm prune --prod # ---- Production runtime ---- FROM node:20-slim AS runner ARG NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="" WORKDIR /app ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ PORT=3000 \ NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=${NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY} RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates openssl \ && rm -rf /var/lib/apt/lists/* \ && mkdir -p /app \ && chown node:node /app # Copy only what is required to run `next start` COPY --from=prod-deps --chown=node:node /app/node_modules ./node_modules COPY --from=builder --chown=node:node /app/package.json ./package.json COPY --from=builder --chown=node:node /app/.next ./.next # Copy public assets only if they exist in the project COPY --from=builder --chown=node:node /app/public ./public COPY --from=builder --chown=node:node /app/next.config.js ./next.config.js COPY --from=builder --chown=node:node /app/src/generated/prisma ./src/generated/prisma # Keep the filesystem owned by the non-root user USER node EXPOSE 3000 # `next start` will read any variables from the environment or a mounted .env.local CMD ["node", "./node_modules/next/dist/bin/next", "start"]