FROM python:3.14-slim AS builder COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ UV_COMPILE_BYTECODE=1 \ UV_LINK_MODE=copy \ UV_LOCKED=1 WORKDIR /app RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=zensical.toml,target=zensical.toml \ --mount=type=bind,source=docs/,target=docs/ \ uvx zensical build RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --no-install-project # COPY --chown=appuser:appuser . /app # RUN --mount=type=cache,target=/root/.cache/uv \ # uv sync --no-editable FROM python:3.14-slim AS runtime ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PATH="/app/.venv/bin:$PATH" \ PERSONAL_MCP_SITE_DIR=/app/site WORKDIR /app EXPOSE 8765 RUN groupadd --system --gid 1001 appuser && \ useradd --system --uid 1001 --gid appuser appuser COPY --from=ghcr.io/astral-sh/uv:latest --chown=appuser:appuser /uv /uvx /bin/ COPY --from=builder --chown=appuser:appuser /app/.venv /app/.venv COPY --from=builder --chown=appuser:appuser /app/site /app/site COPY --chown=appuser:appuser ./docs /app/docs RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ --mount=type=bind,source=src/,target=src/ \ uv sync --no-editable --refresh-package prompts USER appuser CMD ["uvicorn", "personal_mcp.main:create_app", "--factory", "--host", "0.0.0.0", "--port", "8765"]