Merge pull request 'Adapt Dockerfile' (#3) from config into main

Reviewed-on: va/knowledge-search-mcp#3
This commit is contained in:
2026-02-24 00:01:30 +00:00
5 changed files with 58 additions and 42 deletions

View File

@@ -1,25 +0,0 @@
FROM python:3.12-slim AS builder
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --no-dev --frozen --no-install-project
COPY main.py .
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /app /app
ENV PATH="/app/.venv/bin:$PATH"
# Cloud Run injects PORT (defaults to 8080)
ENV PORT=8080
EXPOSE ${PORT}
# Shell form so ${PORT} is expanded at runtime
CMD python main.py --transport sse --port ${PORT}

14
DockerfileConnector Normal file
View File

@@ -0,0 +1,14 @@
FROM quay.ocp.banorte.com/golden/python-312:latest
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --no-dev --frozen
COPY main.py .
ENV PATH="/app/.venv/bin:$PATH"
CMD ["uv", "run", "python", "main.py", "--transport", "sse", "--port", "8000"]

58
main.py
View File

@@ -5,6 +5,7 @@ import argparse
import asyncio
import io
import logging
import os
from collections.abc import AsyncIterator, Sequence
from contextlib import asynccontextmanager
from dataclasses import dataclass
@@ -16,7 +17,7 @@ from gcloud.aio.storage import Storage
from google import genai
from google.genai import types as genai_types
from mcp.server.fastmcp import Context, FastMCP
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, YamlConfigSettingsSource
logger = logging.getLogger(__name__)
@@ -282,10 +283,29 @@ class GoogleCloudVectorSearch:
# ---------------------------------------------------------------------------
class Settings(BaseSettings):
"""Server configuration populated from environment variables."""
def _parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument(
"--transport",
choices=["stdio", "sse"],
default="stdio",
)
parser.add_argument("--host", default="0.0.0.0")
parser.add_argument("--port", type=int, default=8080)
parser.add_argument(
"--config",
default=os.environ.get("CONFIG_FILE", "config.yaml"),
)
return parser.parse_args()
model_config = {"env_file": ".env"}
_args = _parse_args()
class Settings(BaseSettings):
"""Server configuration populated from env vars and a YAML config file."""
model_config = {"env_file": ".env", "yaml_file": _args.config}
project_id: str
location: str
@@ -297,6 +317,23 @@ class Settings(BaseSettings):
embedding_model: str = "gemini-embedding-001"
search_limit: int = 10
@classmethod
def settings_customise_sources(
cls,
settings_cls: type[BaseSettings],
init_settings: PydanticBaseSettingsSource,
env_settings: PydanticBaseSettingsSource,
dotenv_settings: PydanticBaseSettingsSource,
file_secret_settings: PydanticBaseSettingsSource,
) -> tuple[PydanticBaseSettingsSource, ...]:
return (
init_settings,
env_settings,
dotenv_settings,
YamlConfigSettingsSource(settings_cls),
file_secret_settings,
)
@dataclass
class AppContext:
@@ -334,19 +371,6 @@ async def lifespan(_server: FastMCP) -> AsyncIterator[AppContext]:
)
def _parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument(
"--transport",
choices=["stdio", "sse"],
default="stdio",
)
parser.add_argument("--host", default="0.0.0.0")
parser.add_argument("--port", type=int, default=8080)
return parser.parse_args()
_args = _parse_args()
cfg = Settings.model_validate({})
mcp = FastMCP(

View File

@@ -12,6 +12,7 @@ dependencies = [
"google-genai>=1.64.0",
"mcp[cli]>=1.26.0",
"pydantic-settings>=2.9.1",
"pyyaml>=6.0",
]
[dependency-groups]

2
uv.lock generated
View File

@@ -1356,6 +1356,7 @@ dependencies = [
{ name = "google-genai" },
{ name = "mcp", extra = ["cli"] },
{ name = "pydantic-settings" },
{ name = "pyyaml" },
]
[package.dev-dependencies]
@@ -1374,6 +1375,7 @@ requires-dist = [
{ name = "google-genai", specifier = ">=1.64.0" },
{ name = "mcp", extras = ["cli"], specifier = ">=1.26.0" },
{ name = "pydantic-settings", specifier = ">=2.9.1" },
{ name = "pyyaml", specifier = ">=6.0" },
]
[package.metadata.requires-dev]