Adapt Dockerfile #3

Merged
A8065384 merged 2 commits from config into main 2026-02-24 00:01:31 +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 asyncio
import io import io
import logging import logging
import os
from collections.abc import AsyncIterator, Sequence from collections.abc import AsyncIterator, Sequence
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from dataclasses import dataclass from dataclasses import dataclass
@@ -16,7 +17,7 @@ from gcloud.aio.storage import Storage
from google import genai from google import genai
from google.genai import types as genai_types from google.genai import types as genai_types
from mcp.server.fastmcp import Context, FastMCP from mcp.server.fastmcp import Context, FastMCP
from pydantic_settings import BaseSettings from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, YamlConfigSettingsSource
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -282,10 +283,29 @@ class GoogleCloudVectorSearch:
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
class Settings(BaseSettings): def _parse_args() -> argparse.Namespace:
"""Server configuration populated from environment variables.""" 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 project_id: str
location: str location: str
@@ -297,6 +317,23 @@ class Settings(BaseSettings):
embedding_model: str = "gemini-embedding-001" embedding_model: str = "gemini-embedding-001"
search_limit: int = 10 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 @dataclass
class AppContext: 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({}) cfg = Settings.model_validate({})
mcp = FastMCP( mcp = FastMCP(

View File

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

2
uv.lock generated
View File

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