# PR #24407 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[AMD] fix(docker): unbreak nightly when archive.ubuntu.com:80 is unreachable
- 合并时间：2026-05-05 15:39
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/24407

---

# 执行摘要

- 一句话：修复 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 依赖包无法安装。

# 实现拆解

1. **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 秒，防止因瞬时网络波动导致构建失败。
2. **工作流修改（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`：在一个构建步骤中添加。
3. **配置覆盖说明**：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 网络硬化配置，使镜像源替换成为可能。

```dockerfile
# 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 流水线。
- 风险标记：暂无

# 关联脉络

- 暂无明显关联 PR