FROM arm64v8/node:22 AS base ENV SHARP_IGNORE_GLOBAL_CLI_BINARIES=1 ENV VIPS_DISABLE_DEPS=1 ENV PNPM_SCRIPT_RUNNER_ALLOW_BUILD=true RUN corepack enable && corepack prepare pnpm@latest --activate WORKDIR /app FROM base AS builder COPY package.json pnpm-lock.yaml ./ RUN --mount=type=cache,target=/root/.local/share/pnpm/store/v3 \ pnpm install --frozen-lockfile # copy source code COPY . . RUN --mount=type=cache,target=/app/.vinxi \ pnpm run build # ^ produces .output (build artifact) and .vinxi (build cache) # take only the artifacts we need from the build FROM base AS production_builder RUN apt-get update && apt-get install -y jq COPY --from=builder /app/package.json ./ COPY --from=builder /app/pnpm-lock.yaml ./ # Create a new, production-only package files RUN jq 'del(.devDependencies)' package.json > package.prod.json RUN --mount=type=cache,target=/root/.local/share/pnpm/store/v3 \ pnpm install --prod --lockfile-only # Prod image FROM arm64v8/node:22-alpine ENV SHARP_IGNORE_GLOBAL_CLI_BINARIES=1 ENV VIPS_DISABLE_DEPS=1 ENV PNPM_SCRIPT_RUNNER_ALLOW_BUILD=true RUN corepack enable && corepack prepare pnpm@latest --activate WORKDIR /app COPY --from=production_builder /app/package.prod.json ./package.json COPY --from=production_builder /app/pnpm-lock.yaml ./pnpm-lock.yaml RUN --mount=type=cache,target=/root/.local/share/pnpm/store/v3 \ pnpm install --frozen-lockfile --prod COPY --from=builder /app/.output ./.output EXPOSE 3000 CMD ["npm", "run", "start"]