# Development Dockerfile for MCP Server with hot reload
FROM node:20.11.0-alpine AS base
# Install system dependencies
RUN apk update && apk upgrade
RUN apk add --no-cache \
libc6-compat \
openssl \
ca-certificates \
git
# Enable corepack for pnpm
RUN corepack enable && corepack prepare pnpm@10.14.0 --activate
# Set work directory
WORKDIR /app
# Create non-root user
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 mcpuser --ingroup nodejs
# ===== PHASE 1: Dependency Resolution =====
# Copy workspace config
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY turbo.json ./
# Copy ALL package.json files individually for proper workspace resolution
COPY apps/mcp-server/package.json ./apps/mcp-server/
COPY apps/api/package.json ./apps/api/
COPY apps/web/package.json ./apps/web/
COPY apps/docs/package.json ./apps/docs/
# ALL workspace packages (packages/)
COPY packages/analytics/package.json ./packages/analytics/
COPY packages/analytics-infra/package.json ./packages/analytics-infra/
COPY packages/auth/package.json ./packages/auth/
COPY packages/auth-mock/package.json ./packages/auth-mock/
COPY packages/config/package.json ./packages/config/
COPY packages/contracts/package.json ./packages/contracts/
COPY packages/core/package.json ./packages/core/
COPY packages/events/package.json ./packages/events/
COPY packages/github-action/package.json ./packages/github-action/
COPY packages/guardian-lite/package.json ./packages/guardian-lite/
COPY packages/health/package.json ./packages/health/
COPY packages/infrastructure/package.json ./packages/infrastructure/
COPY packages/integrations/package.json ./packages/integrations/
COPY packages/motion/package.json ./packages/motion/
COPY packages/perf/package.json ./packages/perf/
COPY packages/platform/package.json ./packages/platform/
COPY packages/policy-engine/package.json ./packages/policy-engine/
COPY packages/scripts/package.json ./packages/scripts/
COPY packages/sdk/package.json ./packages/sdk/
# ALL OSS packages (packages-oss/)
COPY packages-oss/config/package.json ./packages-oss/config/
COPY packages-oss/contracts/package.json ./packages-oss/contracts/
COPY packages-oss/events/package.json ./packages-oss/events/
COPY packages-oss/infrastructure/package.json ./packages-oss/infrastructure/
COPY packages-oss/sdk/package.json ./packages-oss/sdk/
# Tooling
COPY tooling/*/package.json ./tooling/*/
COPY config/package.json ./config/
# Install all dependencies with cache mounting
RUN --mount=type=cache,id=pnpm-dev,target=/pnpm/store \
pnpm install --no-frozen-lockfile --ignore-scripts
# ===== PHASE 2: Source Code =====
# Copy source code (node_modules excluded by .dockerignore)
COPY . .
# Change ownership to non-root user
RUN chown -R mcpuser:nodejs /app
# Switch to non-root user
USER mcpuser
# Set development environment
ENV NODE_ENV=development
ENV PORT=8081
# Expose MCP port and debugger port
EXPOSE 8081 9231
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8081/health || exit 1
# Start development server
CMD ["pnpm", "--filter", "@snapback/mcp-server", "run", "dev"]