关于 Docker Build and Deployment Guide (mcpo project)
本项目是 mcpo 的 Docker 构建与部署示例,提供预装 npm、curl、Node.js、uv 等工具的镜像,用于把 MCP 服务以 OpenAPI 兼容的 HTTP 端点暴露出来。适合需要在容器中运行 mcpo 并对接 OpenWebUI 的用户。
主要功能
- 01基于 python:3.13-slim 的镜像构建
- 02启动时根据 config.json 动态安装 uvx 与 npx 工具
- 03以非 root 用户 appuser 运行容器
- 04通过卷挂载持久化配置、日志、数据与缓存
- 05支持通过 PIP_SOURCE 构建参数配置 pip 源
适用场景
- 01在 Docker Compose 中部署 mcpo 并接入 OpenWebUI
- 02排查容器内 npx、git 缺失或权限不足等常见问题
MCP 相关
该项目将 MCP 服务封装为 OpenAPI 兼容的 HTTP 端点,容器内运行的 mcpo 负责启动 config.json 中定义的 MCP 服务。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Docker 构建和部署指南(mcpo 项目)
感谢 @BigUncle 提交拉取请求
本指南系统地概述了 mcpo 项目在 Docker 容器环境中的构建、部署、故障排除和最佳实践,反映了项目的当前状态。
I. 项目概述和架构
本项目使用 Docker 和 Docker Compose 对 mcpo(Model Context Protocol OpenAPI Proxy)进行容器化部署。核心设计原则包括:
- 动态安装依赖项:容器启动时,
start.sh脚本会读取config.json,并根据定义的mcpServers动态安装所需的 Python(uvx)和 Node.js(npx)工具。 - 以非 root 用户运行:容器最终以非 root 用户
appuser运行,以增强安全性。 - 依赖项和数据持久化:通过 Docker Compose 卷挂载,将配置、日志、数据以及
uv和npm的缓存目录持久化到主机。 - 灵活的源配置:支持通过构建参数(
PIP_SOURCE)动态配置pip源,并默认使用阿里云镜像来加速apt。 - 环境隔离:在
start.sh中,每个 MCP 工具的安装都在子 shell 中进行,以避免环境变量冲突。
II. 构建和部署流程
1. 环境准备
-
Docker 和 Docker Compose:建议使用 Docker 24+ 和 Docker Compose 2.x。
-
.env文件:在项目根目录中创建.env文件,用于存放敏感信息和配置。包含MCPO_API_KEY。请参阅.env.example。# .env file example # pip source used during Docker build (optional, uses default source if empty) PIP_SOURCE=https://mirrors.aliyun.com/pypi/simple/ # API Key required for mcpo runtime (required) MCPO_API_KEY=your_mcpo_api_key_here # Other API Keys that may be needed for mcp servers (according to config.json) # AMAP_MAPS_API_KEY=your_amap_key # ... other required environment variables -
config.json:配置要启动的 MCP 服务。请参阅config.example.json。 -
网络:确保能够访问 Debian(阿里云镜像)、NodeSource、PyPI(或指定的
PIP_SOURCE)。
2. 目录结构和关键文件
Dockerfile:定义镜像构建流程。- 基础镜像:
python:3.13-slim - 安装:
bash、curl、jq、nodejs(v22.x)、git、uv(通过 pip 安装) - 用户:创建并以
appuser身份运行。 - 配置:支持
PIP_SOURCE构建参数。
- 基础镜像:
start.sh:容器入口脚本。- 设置
HOME、UV_CACHE_DIR、NPM_CONFIG_CACHE。 - 创建持久化目录。
- 读取
config.json并动态安装 MCP 工具(使用uvx或npx)。 - 启动
mcpo主服务。
- 设置
docker-compose.yml:定义服务、构建参数、卷挂载和环境变量。- 将
PIP_SOURCE传递给 Dockerfile。 - 挂载
./config.json、./logs、./data、./node_modules、./.npm、./.uv_cache。 - 通过
env_file将.env加载为运行时环境变量。
- 将
readme-docker.md:本文档。test_mcp_tools.sh:基本功能测试脚本。
3. 构建镜像
# Pass PIP_SOURCE (compose will automatically read from .env if defined)
docker-compose build [--no-cache]
--no-cache:强制重新构建所有层,确保最新更改生效。- 构建过程使用
.env文件中的PIP_SOURCE(如果有效)来配置pip源。
4. 启动服务
# Start service (run in background)
docker-compose up -d
docker-compose.yml会将.env中的变量加载为容器运行时环境变量。start.sh会执行,并动态安装config.json中定义的 MCP 工具。mcpo主服务启动。
III. 常见问题和解决方案
1. npx: command not found / git: command not found
- 原因:未安装
npx(随nodejs一起安装)或git,或者它们的路径不在appuser的PATH环境变量中。 - 解决方案:
- 确认
Dockerfile的apt-get install包含nodejs和git。 - 确认
ENV PATH指令包含/usr/bin(通过apt安装的nodejs和git通常位于此处)。Dockerfile 已包含/app/.local/bin:/usr/bin:/usr/local/bin:$PATH。 - 使用
docker-compose build --no-cache重新构建。
- 确认
2. mkdir: cannot create directory '/root': Permission denied
- 原因:容器以非 root 用户
appuser运行,但脚本或依赖项尝试写入/root目录(例如默认缓存路径)。 - 解决方案:
- 通过
ENV指令(UV_CACHE_DIR、NPM_CONFIG_CACHE、HOME)将所有缓存目录(uv、npm)重定向到/app。 start.sh中的mkdir -p仅操作/app下的目录。- 将
docker-compose.yml中对应的卷挂载路径更新为/app/...。
- 通过
3. pip 未使用自定义源(PIP_SOURCE)
- 原因:构建过程中未将
PIP_SOURCE正确传递给 Dockerfile。 - 解决方案:
- 确保
.env文件包含PIP_SOURCE=https://...。 - 确保
docker-compose.yml的build.args部分包含- PIP_SOURCE=${PIP_SOURCE:-}。 - Dockerfile 通过
ARG PIP_SOURCE接收参数,并在RUN层中通过export PIP_INDEX_URL使用。
- 确保
4. 网络缓慢或失败,以及依赖项安装问题
- 原因:网络连接不佳,访问官方源缓慢或超时。
- 解决方案:
- Dockerfile 已配置为使用阿里云镜像加速
apt。 - 可通过
.env中的PIP_SOURCE为pip配置国内镜像。 - Node.js(NodeSource)和 uv(PyPI/镜像)仍依赖网络;在极端情况下可考虑其他解决方案。
- Dockerfile 已配置为使用阿里云镜像加速
IV. 重要注意事项与最佳实践
- 非 root 用户:始终以
appuser运行容器。 - 持久化:显式挂载
config.json、logs、data、node_modules、.npm、.uv_cache,以保留状态和依赖项。 - 密钥:使用
.env文件管理 API 密钥和敏感信息,并通过env_file注入;切勿将.envCOPY到镜像中,也不要硬编码密钥。.env文件应加入.gitignore。 - 动态安装:
start.sh的动态安装机制提供了灵活性,但首次启动或config.json更改后,启动时间会更长。 - 版本固定:为确保可复现性,建议在
Dockerfile中固定uv版本(pip install --user uv==X.Y.Z),并在config.json中固定npx包版本(@amap/[email protected])。 - 资源限制:在生产环境中,可考虑为
docker-compose.yml中的服务设置内存和 CPU 限制。 - 日志:日志输出到挂载的
./logs目录,便于查看和管理。 - 测试:使用
test_mcp_tools.sh脚本进行基本功能验证。
V. 命令速查
- 构建镜像:
docker-compose build [--no-cache] - 启动服务(后台运行):
docker-compose up -d
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。