|
1 | | -FROM node:22-alpine |
2 | | -ARG VERSION=latest |
| 1 | +### |
| 2 | +# Optimized multi-stage Dockerfile for mongodb-mcp-server |
| 3 | +# |
| 4 | +# Build args: |
| 5 | +# NODE_VERSION Node.js version (default 22-alpine) |
| 6 | +# INSTALL_DEV Keep dev dependencies (true|false, default: false) |
| 7 | +# RUNTIME_IMAGE Base runtime image (default: node:22-alpine) |
| 8 | +# |
| 9 | +# Typical build: |
| 10 | +# docker build -t mongodb-mcp-server:local . |
| 11 | +# docker build --build-arg INSTALL_DEV=true -t mongodb-mcp-server:dev . |
| 12 | +# |
| 13 | +# Runtime (stdio transport): |
| 14 | +# docker run --rm -it mongodb-mcp-server:local --transport stdio |
| 15 | +# |
| 16 | +# Runtime (http transport): |
| 17 | +# docker run --rm -p 3000:3000 mongodb-mcp-server:local --transport http --httpHost 0.0.0.0 |
| 18 | +# curl -s -X POST http://localhost:3000/mcp -H 'Content-Type: application/json' \ |
| 19 | +# -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{}}}' |
| 20 | +# |
| 21 | +# Optional HTTP auth (Azure Managed Identity): |
| 22 | +# docker run --rm -p 3000:3000 \ |
| 23 | +# -e MDB_MCP_HTTP_AUTH_MODE=azure-managed-identity \ |
| 24 | +# -e MDB_MCP_AZURE_MANAGED_IDENTITY_TENANT_ID=<tenant-guid> \ |
| 25 | +# -e MDB_MCP_AZURE_MANAGED_IDENTITY_CLIENT_ID=<app-client-id> \ |
| 26 | +# mongodb-mcp-server:local --transport http --httpHost 0.0.0.0 |
| 27 | +### |
| 28 | + |
| 29 | +# syntax=docker/dockerfile:1.7-labs |
| 30 | + |
| 31 | +ARG NODE_VERSION=22-alpine |
| 32 | +ARG RUNTIME_IMAGE=node:${NODE_VERSION} |
| 33 | +ARG INSTALL_DEV=false |
| 34 | + |
| 35 | +############################################# |
| 36 | +# Builder Stage |
| 37 | +############################################# |
| 38 | +FROM node:${NODE_VERSION} AS builder |
| 39 | +WORKDIR /app |
| 40 | + |
| 41 | +# Leverage Docker layer caching: copy only dependency manifests + tsconfigs first (needed by build scripts) |
| 42 | +COPY package.json package-lock.json* .npmrc* tsconfig*.json eslint.config.js vitest.config.ts ./ |
| 43 | + |
| 44 | +# Install dependencies without running lifecycle scripts (avoid premature build via prepare) |
| 45 | +RUN --mount=type=cache,target=/root/.npm \ |
| 46 | + npm ci --ignore-scripts |
| 47 | + |
| 48 | +# Copy application sources |
| 49 | +COPY src ./src |
| 50 | +COPY scripts ./scripts |
| 51 | + |
| 52 | +# Now run the build explicitly (includes prepare sequence tasks) |
| 53 | +RUN npm run build |
| 54 | + |
| 55 | +# Optionally prune dev dependencies for slimmer runtime |
| 56 | +ARG INSTALL_DEV |
| 57 | +RUN if [ "${INSTALL_DEV}" != "true" ]; then npm prune --omit=dev; fi |
| 58 | + |
| 59 | +############################################# |
| 60 | +# Runtime Stage |
| 61 | +############################################# |
| 62 | +FROM ${RUNTIME_IMAGE} AS runtime |
| 63 | +ENV NODE_ENV=production \ |
| 64 | + MDB_MCP_LOGGERS=stderr,mcp |
| 65 | + |
| 66 | +# Create non-root user |
3 | 67 | RUN addgroup -S mcp && adduser -S mcp -G mcp |
4 | | -RUN npm install -g mongodb-mcp-server@${VERSION} |
5 | | -USER mcp |
6 | 68 | WORKDIR /home/mcp |
7 | | -ENV MDB_MCP_LOGGERS=stderr,mcp |
8 | | -ENTRYPOINT ["mongodb-mcp-server"] |
9 | | -LABEL maintainer="MongoDB Inc <info@mongodb.com>" |
10 | | -LABEL description="MongoDB MCP Server" |
11 | | -LABEL version=${VERSION} |
| 69 | + |
| 70 | +# Copy only required artifacts (preserve ownership in a single layer) |
| 71 | +COPY --chown=mcp:mcp --from=builder /app/package*.json ./ |
| 72 | +COPY --chown=mcp:mcp --from=builder /app/node_modules ./node_modules |
| 73 | +COPY --chown=mcp:mcp --from=builder /app/dist ./dist |
| 74 | + |
| 75 | +USER mcp |
| 76 | + |
| 77 | +# Expose default HTTP port (matches default config httpPort=3000) |
| 78 | +EXPOSE 3000 |
| 79 | + |
| 80 | +LABEL maintainer="MongoDB Inc <info@mongodb.com>" \ |
| 81 | + org.opencontainers.image.title="mongodb-mcp-server" \ |
| 82 | + org.opencontainers.image.description="MongoDB MCP Server" \ |
| 83 | + org.opencontainers.image.source="https://github.com/mongodb-js/mongodb-mcp-server" |
| 84 | + |
| 85 | +# Use exec form for clarity; default command may be overridden at runtime |
| 86 | +ENTRYPOINT ["node", "dist/index.js"] |
| 87 | +CMD ["--transport", "http"] |
0 commit comments