Prhub

#44984 fix(docker): eliminate race conditions in shared buildkit cache mounts

原始 PR 作者 weizhoublue 合并时间 2026-06-27 10:43 文件变更 3 提交数 2 评论 8 代码增减 +8 / -6

执行摘要

修复 Docker 共享构建缓存竞态条件

PR body 指出 root cause:--mount=type=cache 默认 sharing=shared,多个容器并发读写同一 host 目录会导致 cargo 写冲突。vllm 的 release pipeline 包含并行 job,容易触发此问题。

值得合并,属低风险基础设施改进。建议精读 Dockerfile 中 cargo 缓存部分,理解 BuildKit 缓存共享语义。

讨论亮点

Reviewer Harry-Chen 询问是否有真实 CI 日志可证明竞态条件发生。作者 weizhoublue 回复分析:Dockerfile.cpuDockerfile.rocm 已使用 sharing=locked,但主 Dockerfile 未设置;release pipeline 中 Build Python wheels 组包含 6 个并行 step,可能触发冲突。无进一步反对意见,reviewer 最终 approve。

实现拆解

  1. docker/Dockerfile 中,将 cargo registry 和 git 缓存挂载的 sharing=shared(默认)改为 sharing=locked,确保同一时间只有一个容器访问缓存目录。
  2. docker/Dockerfile.nightly_torchdocker/Dockerfile.xpu 做相同修改,保持三个 Dockerfile 行为一致。
  3. 修改仅涉及 RUN --mount=type=cache 行,每个文件变更 2-3 行,无代码逻辑改动。
文件 模块 状态 重要度
docker/Dockerfile 容器构建 modified 3.02
docker/Dockerfile.nightly_torch 容器构建 modified 2.62
docker/Dockerfile.xpu 容器构建 modified 2.56

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

竞态条件真实案例 question

Harry-Chen 询问是否有真实 CI 日志证明竞态条件发生

结论:作者解释 release pipeline 中并行 step 可能触发,且 Dockerfile.cpu、Dockerfile.rocm 已使用 similar 设置 · 已解决

风险与影响

风险极低:仅改变 Docker 构建缓存的共享语义,不影响运行时逻辑。sharing=locked 仅在多个构建同时使用相同缓存目录时生效,单机单构建无变化。可能轻微增加构建时间(因序列化访问),但对 CI 影响可忽略。

影响范围:仅影响使用 cargo 缓存的 Docker 构建过程(主要涉及 Rust 组件构建)。用户端:无影响。系统端:消除并行构建中的竞态条件,增强 CI 稳定性。团队:减少因缓存冲突导致的构建失败排查时间。

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论