# ============================================================================= # 阶段一:编译阶段 # 将核心业务目录编译为原生二进制,源码不进入最终镜像 # ============================================================================= FROM python:3.11-slim-bookworm AS builder WORKDIR /build # 替换为阿里云 apt 镜像源,解决国内网络访问 Debian 官方源超时问题 RUN sed -i 's|http://deb.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources \ || sed -i 's|http://deb.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list # 系统依赖:gcc/g++ 用于 Nuitka 编译;patchelf 用于修正共享库路径 RUN apt-get update && apt-get install -y --no-install-recommends \ gcc g++ patchelf ccache \ && rm -rf /var/lib/apt/lists/* # 配置镜像源 ENV PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ ENV UV_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ ENV UV_HTTP_TIMEOUT=120 ENV UV_HTTP_RETRIES=5 RUN pip install --no-cache-dir uv COPY pyproject.toml uv.lock ./ RUN uv sync --frozen --no-dev # nuitka 安装到 venv 中,确保与 .venv/bin/python 一致 RUN uv pip install --no-cache-dir nuitka # 复制所有源码 COPY . . # 编译需要保护的目录(admin api core logger models services tools utils) # --module:编译为可 import 的扩展模块(.so),而不是独立可执行文件 # --follow-import-to:只跟踪项目自身的包,不拉入标准库和第三方包 # --output-dir:编译产物输出目录(每个包单独编译) RUN for pkg in admin api core logger models services tools utils; do \ uv run python -m nuitka \ --module \ --follow-import-to=admin \ --follow-import-to=api \ --follow-import-to=core \ --follow-import-to=logger \ --follow-import-to=models \ --follow-import-to=services \ --follow-import-to=tools \ --follow-import-to=utils \ --include-package=${pkg} \ --output-dir=/compiled \ --remove-output \ ${pkg} ; \ done # ============================================================================= # 阶段二:运行阶段 # 只包含编译产物和必要运行时,不含任何 .py 源码 # ============================================================================= FROM python:3.11-slim-bookworm WORKDIR /app ENV PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ ENV UV_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ ENV UV_HTTP_TIMEOUT=120 ENV UV_HTTP_RETRIES=5 RUN pip install --no-cache-dir uv # 复制依赖声明文件并安装生产依赖 COPY pyproject.toml uv.lock ./ RUN uv sync --frozen --no-dev # 从编译阶段复制二进制模块(.so 文件) COPY --from=builder /compiled/ ./ # 保留必要的明文文件 # main.py:uvicorn 入口,只有两行 import,不含业务逻辑 COPY main.py ./ # prompt/:提示词模板,运行时动态读取 COPY prompt/ ./prompt/ # services/fonts/:字体资源文件 COPY services/fonts/ ./services/fonts/ # 工作目录固定为 /app,所有路径相关代码基于 cwd 解析 ENV PYTHONUNBUFFERED=1 ENV APP_DIR=/app EXPOSE 7862 CMD ["uv", "run", "python", "-m", "main"]