# syntax=docker/dockerfile:1 # Control plane (Fastify). Runs via tsx — workspace packages are consumed as raw # TypeScript, so there is no separate compile step (same model as runner-template). # Build context must be the repo root: docker build -f apps/api/Dockerfile . FROM node:20-alpine AS base RUN corepack enable && corepack prepare pnpm@9.12.0 --activate WORKDIR /app # ---- deps: install the whole workspace from the lockfile ---- FROM base AS deps COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ COPY apps/api/package.json apps/api/ COPY apps/web/package.json apps/web/ COPY apps/generator/package.json apps/generator/ COPY apps/runner-template/package.json apps/runner-template/ COPY packages/auth/package.json packages/auth/ COPY packages/db/package.json packages/db/ COPY packages/llm/package.json packages/llm/ COPY packages/types/package.json packages/types/ RUN pnpm install --frozen-lockfile # ---- runtime ---- FROM deps AS runtime # docker CLI: the API stops/removes generated MCP containers via the host daemon. RUN apk add --no-cache docker-cli ENV NODE_ENV=production COPY . . WORKDIR /app/apps/api EXPOSE 4000 HEALTHCHECK --interval=20s --timeout=4s --start-period=20s --retries=3 \ CMD wget -qO- http://localhost:4000/health || exit 1 CMD ["pnpm", "start"]