61 lines
2.1 KiB
Docker
61 lines
2.1 KiB
Docker
|
|
# HTTP-only mcplocal for k8s deploy (Service `mcp`, Ingress `mcp.ad.itaz.eu`).
|
||
|
|
# Container CMD runs the `serve.ts` entry which — unlike the systemd/STDIO
|
||
|
|
# entry — has no stdin/stdout MCP client and bootstraps exclusively from env.
|
||
|
|
|
||
|
|
# Stage 1: Build TypeScript
|
||
|
|
FROM node:20-alpine AS builder
|
||
|
|
|
||
|
|
RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
|
||
|
|
|
||
|
|
WORKDIR /app
|
||
|
|
|
||
|
|
# Copy workspace config and package manifests
|
||
|
|
COPY pnpm-workspace.yaml pnpm-lock.yaml package.json tsconfig.base.json ./
|
||
|
|
COPY src/mcplocal/package.json src/mcplocal/tsconfig.json src/mcplocal/
|
||
|
|
COPY src/shared/package.json src/shared/tsconfig.json src/shared/
|
||
|
|
COPY src/db/package.json src/db/tsconfig.json src/db/
|
||
|
|
|
||
|
|
# Install all dependencies
|
||
|
|
RUN pnpm install --frozen-lockfile
|
||
|
|
|
||
|
|
# Copy source
|
||
|
|
COPY src/mcplocal/src/ src/mcplocal/src/
|
||
|
|
COPY src/shared/src/ src/shared/src/
|
||
|
|
COPY src/db/src/ src/db/src/
|
||
|
|
COPY src/db/prisma/ src/db/prisma/
|
||
|
|
|
||
|
|
# Build (mcplocal depends on shared; db is pulled transitively by shared/... actually
|
||
|
|
# mcplocal does not depend on db at runtime — prisma client is only used by mcpd).
|
||
|
|
RUN pnpm -F @mcpctl/shared build && pnpm -F @mcpctl/mcplocal build
|
||
|
|
|
||
|
|
# Stage 2: Production runtime
|
||
|
|
FROM node:20-alpine
|
||
|
|
|
||
|
|
RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
|
||
|
|
|
||
|
|
WORKDIR /app
|
||
|
|
|
||
|
|
# Copy workspace config, manifests, and lockfile
|
||
|
|
COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./
|
||
|
|
COPY src/mcplocal/package.json src/mcplocal/
|
||
|
|
COPY src/shared/package.json src/shared/
|
||
|
|
|
||
|
|
# Install deps (production only — no db / prisma runtime here).
|
||
|
|
RUN pnpm install --frozen-lockfile
|
||
|
|
|
||
|
|
# Copy built output
|
||
|
|
COPY --from=builder /app/src/shared/dist/ src/shared/dist/
|
||
|
|
COPY --from=builder /app/src/mcplocal/dist/ src/mcplocal/dist/
|
||
|
|
|
||
|
|
EXPOSE 3200
|
||
|
|
|
||
|
|
# Cache directory — expected to be mounted as a PVC in k8s.
|
||
|
|
VOLUME /var/lib/mcplocal/cache
|
||
|
|
|
||
|
|
HEALTHCHECK --interval=10s --timeout=5s --retries=3 --start-period=10s \
|
||
|
|
CMD wget -q --spider http://localhost:3200/healthz || exit 1
|
||
|
|
|
||
|
|
# MCPLOCAL_MCPD_URL and MCPLOCAL_MCPD_TOKEN are required and must come from
|
||
|
|
# the Pulumi-managed Secret. Other env vars default sensibly.
|
||
|
|
CMD ["node", "src/mcplocal/dist/serve.js"]
|