Docker Build and Deployment Guide (mcpo project) について
mcpo を Docker で構築・デプロイするためのガイドと、npm、curl、Node.js、uv などを含むサンプルイメージです。MCP サーバーを OpenAPI 互換の HTTP エンドポイントとして公開し、OpenWebUI から利用できます。Docker Compose でコンテナ上に mcpo を動かしたい利用者に向いています。
主な機能
- 01python:3.13-slim ベースのイメージ構成
- 02起動時に config.json から uvx と npx のツールを導入
- 03非 root ユーザー appuser でのコンテナ実行
- 04ボリュームマウントによる設定・ログ・データ・キャッシュの永続化
- 05PIP_SOURCE ビルド引数による pip ソースの指定
活用シーン
- 01Docker Compose による mcpo のデプロイと OpenWebUI への接続
- 02コンテナ内での npx・git の未インストールや権限エラーの解消
MCP 対応
コンテナ内の mcpo は、config.json で定義された MCP サーバーを OpenAPI 互換の HTTP エンドポイントとして公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Docker ビルドとデプロイガイド(mcpo プロジェクト)
プルリクエストをいただいた @BigUncle に感謝します。
このガイドでは、プロジェクトの現在の状態を踏まえ、Docker コンテナ環境における mcpo プロジェクトのビルド、デプロイ、トラブルシューティング、ベストプラクティスを体系的に説明します。
I. プロジェクトの概要とアーキテクチャ
このプロジェクトでは、mcpo(Model Context Protocol OpenAPI Proxy)のコンテナ化されたデプロイに Docker と Docker Compose を使用します。主な設計原則は次のとおりです。
- 動的な依存関係のインストール:コンテナの起動時に、
start.shスクリプトがconfig.jsonを読み込み、定義されたmcpServersに基づいて必要な Python(uvx)および Node.js(npx)ツールを動的にインストールします。 - 非 root ユーザーでの実行:セキュリティを強化するため、最終的にコンテナは非 root ユーザー
appuserとして実行されます。 - 依存関係とデータの永続化:Docker Compose のボリュームマウントを通じて、設定、ログ、データ、
uvとnpmのキャッシュディレクトリをホストマシンに永続化します。 - 柔軟なソース設定:ビルド引数(
PIP_SOURCE)によるpipソースの動的な設定をサポートし、aptの高速化のため、デフォルトで Aliyun ミラーを使用します。 - 環境の分離:
start.shでは、環境変数の競合を避けるため、各 MCP ツールのインストールをサブシェル内で実行します。
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(Aliyun ミラー)、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を高速化するために Aliyun ミラーを使用するよう設定されています。 .envのPIP_SOURCEを使って、pipに国内ミラーを設定できます。- Node.js(NodeSource)と uv(PyPI/ミラー)は引き続きネットワークに依存します。極端なケースでは、別の解決策を検討してください。
- Dockerfile は、
IV. 重要な注意事項とベストプラクティス
- root 以外のユーザー:コンテナは必ず
appuserとして実行してください。 - 永続化:状態と依存関係を保持するため、
config.json、logs、data、node_modules、.npm、.uv_cacheを明示的にマウントしてください。 - シークレット:API キーや機密情報は
.envファイルで管理し、env_fileを通じて渡してください。.envをイメージにCOPYしたり、キーをハードコードしたりしないでください。.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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。