From 2eea0ca746f34d54626a1036c6f5ea9dc84f0e2a Mon Sep 17 00:00:00 2001
From: "Chen, Li"
Date: Fri, 9 Oct 2026 10:36:17 +0800
Subject: [PATCH] add docker
---
.dockerignore | 7 +++++++
Dockerfile | 24 ++++++++++++++++++++++++
README.md | 16 ++++++++++++++++
compose.yaml | 11 +++++++++++
src/mini_db_mcp/domain/domain_model.py | 20 ++++++++++----------
5 files changed, 68 insertions(+), 10 deletions(-)
create mode 100644 .dockerignore
create mode 100644 Dockerfile
create mode 100644 compose.yaml
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..15a5274
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,7 @@
+.env
+.git
+.pytest_cache
+.venv
+__pycache__
+*.py[cod]
+tests
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..34e2a82
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,24 @@
+FROM python:3.12-slim
+
+ENV PYTHONDONTWRITEBYTECODE=1 \
+ PYTHONUNBUFFERED=1 \
+ UV_COMPILE_BYTECODE=1 \
+ UV_LINK_MODE=copy
+
+WORKDIR /app
+
+COPY --from=ghcr.io/astral-sh/uv:0.9.17 /uv /uvx /bin/
+
+COPY pyproject.toml uv.lock ./
+RUN uv sync --frozen --no-dev --no-install-project
+
+COPY src ./src
+RUN uv sync --frozen --no-dev
+
+RUN useradd -m -s /bin/bash appuser
+USER appuser
+ENV PATH="/app/.venv/bin:$PATH"
+
+EXPOSE 8000
+
+CMD ["mcp"]
\ No newline at end of file
diff --git a/README.md b/README.md
index a540b9b..f491ef6 100644
--- a/README.md
+++ b/README.md
@@ -118,6 +118,22 @@ uv run mcp
MCP 端点为 `http://127.0.0.1:8000/mcp`。
+### Docker Compose
+
+先按上文创建并填写 `.env`,然后启动服务:
+
+```powershell
+docker compose up --build -d
+```
+
+Compose 会强制使用 HTTP 传输,并将 MCP 端点暴露为 `http://127.0.0.1:8000/mcp`。
+
+停止服务:
+
+```powershell
+docker compose down
+```
+
## MCP 客户端配置
使用 `stdio` 的客户端可参考以下配置。请将项目路径替换为本机的绝对路径:
diff --git a/compose.yaml b/compose.yaml
new file mode 100644
index 0000000..670764b
--- /dev/null
+++ b/compose.yaml
@@ -0,0 +1,11 @@
+services:
+ mini-db-mcp:
+ build: .
+ env_file:
+ - .env
+ environment:
+ MCP_TRANSPORT: http
+ MCP_HOST: 0.0.0.0
+ ports:
+ - "${MCP_PORT:-8000}:8000"
+ restart: unless-stopped
\ No newline at end of file
diff --git a/src/mini_db_mcp/domain/domain_model.py b/src/mini_db_mcp/domain/domain_model.py
index 372e61a..0384ca0 100644
--- a/src/mini_db_mcp/domain/domain_model.py
+++ b/src/mini_db_mcp/domain/domain_model.py
@@ -85,6 +85,16 @@ class DomainBaseModel(BaseModel):
)
+class ChildToolDefinition(DomainBaseModel):
+ """Exact child tool of a domain."""
+
+ tool_name: Identity
+ tool_title: NonEmptyText
+ tool_description: NonEmptyText
+ input_schema: JsonObject
+ output_schema: JsonObject
+
+
class DomainDefinition(DomainBaseModel):
"""Top-level domain definition."""
@@ -109,16 +119,6 @@ class DomainDefinition(DomainBaseModel):
return self
-class ChildToolDefinition(DomainBaseModel):
- """Exact child tool of a domain."""
-
- tool_name: Identity
- tool_title: NonEmptyText
- tool_description: NonEmptyText
- input_schema: JsonObject
- output_schema: JsonObject
-
-
class DomainToolRequest(DomainBaseModel):
"""Common request shape for discovery and exact child execution."""