97 lines
3.4 KiB
Docker
97 lines
3.4 KiB
Docker
# =============================================================================
|
||
# 阶段一:编译阶段
|
||
# 将核心业务目录编译为原生二进制,源码不进入最终镜像
|
||
# =============================================================================
|
||
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
|
||
|
||
# 安装 Playwright Chromium 浏览器及系统依赖(crawl4ai 网页抓取功能依赖)
|
||
RUN uv run playwright install chromium \
|
||
&& uv run playwright install-deps chromium
|
||
|
||
# 从编译阶段复制二进制模块(.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"]
|