执行摘要
- 一句话:修复 AMD Docker 构建因镜像不可达失败的问题
- 推荐动作:该 PR 是典型的基础设施修复,变更清晰、范围有限,适合快速合入。建议阅读
docker/rocm.Dockerfile 中的实现,了解如何在 Dockerfile 中优雅地处理源替换和 apt 网络硬化。
功能与动机
Release Docker Images Nightly ROCm7.2 (AMD) 构建在 TileLang 阶段失败,原因是 amd-docker-scale 运行器无法到达 Canonical 的 archive.ubuntu.com 镜像 IP 的端口 80。PR body 中详细列出了错误日志,显示所有 8 个 archive.ubuntu.com IP 均超时,导致 llvm-18 依赖包无法安装。
实现拆解
- Dockerfile 修改(docker/rocm.Dockerfile):添加可选的
UBUNTU_MIRROR 构建参数,默认值为空字符串(不影响本地构建)。当该参数非空时,通过 sed 将 /etc/apt/sources.list 中所有 http://*archive.ubuntu.com 和 http://*security.ubuntu.com 的 URL 替换为指定的镜像地址。同时创建 apt 配置文件 /etc/apt/apt.conf.d/80-net-hardening,设置重试次数为 5、HTTP/HTTPS 超时为 30 秒,防止因瞬时网络波动导致构建失败。
- 工作流修改(3 个 YAML 文件):在三个 AMD 相关工作流中,向
docker build 命令添加 --build-arg UBUNTU_MIRROR=https://archive.ubuntu.com 参数:
.github/workflows/release-docker-amd-rocm720-nightly.yml:在两个构建步骤中分别添加。
.github/workflows/release-docker-amd-nightly.yml:在一个构建步骤中添加。
.github/workflows/release-docker-amd.yml:在一个构建步骤中添加。
- 配置覆盖说明:PR 注释说明该模式已与 NVIDIA Dockerfile 和 NPU Dockerfile 保持一致,确保 CI 运行器即使无法访问 Canonical 的端口 80 镜像 IP 也能完成
apt-get update。
关键文件:
docker/rocm.Dockerfile(模块 Dockerfile;类别 infra;类型 infrastructure): 核心变更文件,引入 UBUNTU_MIRROR 构建参数和 apt 网络硬化配置,使镜像源替换成为可能。
.github/workflows/release-docker-amd-rocm720-nightly.yml(模块 CI 工作流;类别 infra;类型 infrastructure): AMD ROCm 7.2 夜间构建工作流,传递 --build-arg UBUNTU_MIRROR 参数。
.github/workflows/release-docker-amd-nightly.yml(模块 CI 工作流;类别 infra;类型 infrastructure): AMD 通用夜间构建工作流,同样需要传递该参数。
.github/workflows/release-docker-amd.yml(模块 CI 工作流;类别 infra;类型 infrastructure): AMD 正式发布工作流,确保发布构建也能受益于镜像替换。
关键符号:未识别
关键源码片段
docker/rocm.Dockerfile
核心变更文件,引入 UBUNTU_MIRROR 构建参数和 apt 网络硬化配置,使镜像源替换成为可能。
# docker/rocm.Dockerfile
# Optional Ubuntu mirror override + apt hardening.
# UBUNTU_MIRROR is empty by default (no behaviour change for local builds).
# When set (typically in CI), all http://*archive.ubuntu.com and
# http://*security.ubuntu.com entries in /etc/apt/sources.list are rewritten
# to point at the given base URL.
ARG UBUNTU_MIRROR=
USER root
RUN if [ -n "$UBUNTU_MIRROR" ]; then \
sed -i "s|http://[^[:space:]/]*archive.ubuntu.com|$UBUNTU_MIRROR|g" /etc/apt/sources.list && \
sed -i "s|http://[^[:space:]/]*security.ubuntu.com|$UBUNTU_MIRROR|g" /etc/apt/sources.list; \
fi && \
printf 'Acquire::Retries "5";\nAcquire::http::Timeout "30";\nAcquire::https::Timeout "30";\n' \
> /etc/apt/apt.conf.d/80-net-hardening
评论区精华
未发现实质性讨论,仅有 HaiShaw 的两次批准,且 PR 已有 amd 标签。
风险与影响
- 风险:风险极低。变更仅限于基础设施配置,不涉及任何运行时逻辑。镜像替换逻辑仅在
UBUNTU_MIRROR 非空时触发,不影响本地构建。apt 超时配置为增量添加,不会破坏现有行为。若镜像地址不可用或存在兼容性问题(如某些包只能从原始源获取),可能导致构建失败,但原始源本身已不可达,因此该风险可接受。
- 影响:直接影响 AMD Docker 镜像的持续构建和发布。修复后,夜间构建应能成功完成,避免因网络问题阻塞流水线。对用户无直接影响。对团队而言,减少了因基础设施中断导致的构建失败和人工干预成本。影响范围仅限于 AMD 相关 Docker 流水线。
- 风险标记:暂无
关联脉络
参与讨论