Skip to content

[Bug] Docker 构建失败: uv sync 报 "Readme path must be within the project directory: ../README.md" #205

Description

@johnnysunwustl

环境

  • 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 必然失败。

根因分析

  1. backend/pyproject.toml 声明 readme = "../README.md"(开发布局下正确,README 在仓库根目录);
  2. Dockerfile 后端阶段把 backend/pyproject.toml 复制为 /app/pyproject.toml,而 README 被复制到 /README.md(项目目录);
  3. 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 syncREADME.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 构建,同样可行。)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions