This Dockerfile maximizes layer caching through `pnpm fetch` and multi-step dependencies installation. See https://pnpm.io/docker#example-3-build-on-cicd ```dockerfile FROM node:22-alpine AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable WORKDIR /app # Fetch dependencies FROM base AS install COPY pnpm-lock.yaml ./ RUN pnpm fetch COPY . . RUN pnpm install --offline --prod --frozen-lockfile # Install dev dependencies RUN pnpm install --offline --frozen-lockfile # Build ENV NODE_ENV=production RUN pnpm build ENTRYPOINT ["node", "build"] EXPOSE 3000 ``` You can safely clean with `docker builder prune --f` after that. It won't touch the cache.