环境
- macOS 26 (arm64) / Docker Desktop 29.4 / Docker Compose v5.1.2
- 版本: v0.1.88 (commit
9b9538a)
- 目标镜像:
python:3.11-slim + uv sync (hatchling build backend)
复现步骤
git clone https://github.com/shy3130/tickflow-stock-panel.git
cd tickflow-stock-panel
cp .env.example .env
docker compose up --build
报错
Docker 构建到 runtime 阶段 uv sync 时失败:
Building tickflow-stock-panel-backend @ file:///app
...
ValueError: Readme path must be within the project directory:
../README.md
完整日志:
#28 [runtime 7/13] RUN uv sync --frozen "$@" || uv sync "$@"
#28 14.78 × Failed to build `tickflow-stock-panel-backend @ file:///app`
#28 14.78 ├─▶ The build backend returned an error
#28 14.78 ╰─▶ Call to `hatchling.build.build_editable` failed (exit status: 1)
按 README「方式 B: Docker 部署最省心」直接 docker compose up --build 必然失败。
根因分析
backend/pyproject.toml 声明 readme = "../README.md"(开发布局下正确,README 在仓库根目录);
- Dockerfile 后端阶段把
backend/pyproject.toml 复制为 /app/pyproject.toml,而 README 被复制到 /README.md(项目目录外);
uv sync 需要构建 editable 安装,新版 hatchling 校验 readme 的规范化路径必须位于项目目录内,../README.md 越界即报 ValueError。
关键点:hatchling 的校验针对路径本身(带 .. 越界即拒绝),与文件实际存在的位置无关——只把 README 复制到项目目录外无法绕过;必须让 readme 字段指向项目目录内的路径。
为什么不能直接改 backend/pyproject.toml
若把 readme 改为 "README.md",Docker 构建可以通过(配合 COPY README.md ./README.md),但会破坏 Dev 模式:cd backend && uv sync 时 README.md 相对 backend/ 解析,而仓库里 backend/ 下并没有 README.md,本地开发会报 readme 文件缺失。
建议修复(已在 arm64 上验证通过)
在 Dockerfile 后端依赖阶段就地修正容器内副本,不改仓库源文件:
COPY README.md ./README.md
COPY backend/pyproject.toml backend/uv.lock* ./
RUN sed -i 's|readme = "../README.md"|readme = "README.md"|' pyproject.toml
以上改动在本机重新 docker compose up --build 构建成功,容器服务正常运行。
(备选:uv sync --no-install-project + Dockerfile 已有的 PYTHONPATH=/app 也能绕开 editable 构建,同样可行。)
环境
9b9538a)python:3.11-slim+uv sync(hatchling build backend)复现步骤
git clone https://github.com/shy3130/tickflow-stock-panel.git cd tickflow-stock-panel cp .env.example .env docker compose up --build报错
Docker 构建到 runtime 阶段
uv sync时失败:完整日志:
按 README「方式 B: Docker 部署最省心」直接
docker compose up --build必然失败。根因分析
backend/pyproject.toml声明readme = "../README.md"(开发布局下正确,README 在仓库根目录);backend/pyproject.toml复制为/app/pyproject.toml,而 README 被复制到/README.md(项目目录外);uv sync需要构建 editable 安装,新版 hatchling 校验 readme 的规范化路径必须位于项目目录内,../README.md越界即报ValueError。关键点:hatchling 的校验针对路径本身(带
..越界即拒绝),与文件实际存在的位置无关——只把 README 复制到项目目录外无法绕过;必须让 readme 字段指向项目目录内的路径。为什么不能直接改 backend/pyproject.toml
若把 readme 改为
"README.md",Docker 构建可以通过(配合COPY README.md ./README.md),但会破坏 Dev 模式:cd backend && uv sync时README.md相对backend/解析,而仓库里backend/下并没有 README.md,本地开发会报 readme 文件缺失。建议修复(已在 arm64 上验证通过)
在 Dockerfile 后端依赖阶段就地修正容器内副本,不改仓库源文件:
以上改动在本机重新
docker compose up --build构建成功,容器服务正常运行。(备选:
uv sync --no-install-project+ Dockerfile 已有的PYTHONPATH=/app也能绕开 editable 构建,同样可行。)