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
1+ FROM node:22-alpine
2+ ARG VERSION=latest
673RUN addgroup -S mcp && adduser -S mcp -G mcp
68- WORKDIR /home/mcp
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-
4+ RUN npm install -g mongodb-mcp-server@${VERSION}
755USER mcp
76-
77- # Expose default HTTP port (matches default config httpPort=3000)
78- EXPOSE 3000
79-
80- LABEL maintainer=
"MongoDB Inc <[email protected] >" \
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" ]
6+ WORKDIR /home/mcp
7+ ENV MDB_MCP_LOGGERS=stderr,mcp
8+ ENTRYPOINT ["mongodb-mcp-server" ]
9+ LABEL maintainer=
"MongoDB Inc <[email protected] >" 10+ LABEL description="MongoDB MCP Server"
11+ LABEL version=${VERSION}
0 commit comments