fix: Worker构建fallback改用buildx,修复DooD模式下基础镜像构建失败 #702
Reference in New Issue
Block a user
Delete Branch "fix/worker-build-dood-fallback"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
Worker构建在基础镜像缓存miss时,fallback到本地构建使用普通docker build,在DooD(Docker out of Docker)模式下失败。
根因:DooD模式下,docker daemon运行在宿主机上,checkout的代码在runner容器内。普通docker build -f infra/docker/xxx.Dockerfile . 会从宿主机当前目录找Dockerfile,找不到。
主构建为什么能成功:主构建设计上使用docker buildx build --driver docker-container,buildx会把context(源代码)传输到builder容器中,因此在DooD下能正常工作。
修复方案
在pre-build fallback路径中,也使用buildx docker-container驱动来构建基础镜像,和主构建保持一致。
改动
影响
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
📊 审查概览
❌ 需修改的问题(严重)
[.gitea/workflows/ci-pipeline.yml: ~650-670] 构建失败未正确退出
for attempt in 1 2 3的重试循环中,如果docker buildx build连续 3 次均失败,循环结束后脚本会继续向下执行,而不是报错终止 CI 流程。这会导致后续步骤(如echo "fallback=true")正常执行,掩盖了构建失败的事实,可能导致 CI 误判为成功。exit 1或其他错误处理逻辑。例如:[infra/docker/worker.Dockerfile: 14, 36] 基础镜像来源与 CI 逻辑不一致
ci-pipeline.yml中花费资源构建了本地的worker-base-builder和worker-base-runtime镜像(使用--load加载到本地)。然而,worker.Dockerfile中的FROM指令被硬编码为从阿里云拉取镜像(xiaoxia-registry...)。这导致 CI 中构建的本地镜像被worker.Dockerfile忽略,不仅浪费了 CI 构建时间,还可能导致运行时使用的镜像版本与 CI 刚构建的代码不一致。ARG动态传入基础镜像名,或者保持使用本地构建时的镜像命名;ci-pipeline.yml中对应的本地构建步骤以节省资源。💡 改进建议(一般)
:latest标签。虽然这是从旧代码继承过来的习惯,但在生产环境或 CI 环境中,latest标签具有不确定性,可能导致构建不可复现。建议使用具体的版本号或 Commit Hash 作为镜像标签,确保构建的一致性。✅ 良好实践
docker buildx的docker-container驱动,解决了 DooD (Docker-outside-of-Docker) 模式下的可见性问题。🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 11:26:54 | 模型:
🗑️ 预览环境已清理
PR #702 已关闭或合并,对应的预览环境已被清理。