# syntax=docker/dockerfile:1.7 # # PayloadCMS production image. Built and run by docker-compose. # We install pnpm globally via npm so we don't depend on corepack's # (sometimes strict) version negotiation. FROM node:20-alpine AS base RUN npm install -g pnpm@latest WORKDIR /repo # ---- deps ----------------------------------------------------------------- # Install ALL workspace deps at the root so the `apps/cms` package can # resolve its siblings (@payloadcms/*, next, react, etc.) and the root # tooling (prettier) is also available. FROM base AS deps COPY pnpm-workspace.yaml package.json ./ COPY apps/cms/package.json ./apps/cms/package.json COPY apps/web/package.json ./apps/web/package.json COPY pnpm-lock.yaml* ./ RUN if [ -f pnpm-lock.yaml ]; then \ pnpm install --frozen-lockfile; \ else \ echo "No pnpm-lock.yaml found; running pnpm install (generates one)"; \ pnpm install; \ fi # ---- build ---------------------------------------------------------------- FROM deps AS build COPY apps/cms ./apps/cms WORKDIR /repo/apps/cms RUN pnpm run build # ---- runtime -------------------------------------------------------------- FROM base AS runtime ENV NODE_ENV=production WORKDIR /repo/apps/cms COPY --from=build /repo ./ EXPOSE 3000 CMD ["pnpm", "start"]