# PR #28474 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[router] Multi-arch experimental sgl-router image + fix distroless libpcre2 startup crash
- 合并时间：2026-06-17 11:09
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/28474

---

# 执行摘要

- 一句话：修复 sgl-router 镜像多架构与运行时崩溃
- 推荐动作：建议合并。变更有明确动机、验证充分，且此前引入的镜像缺陷属于功能性阻塞。CI 工作流结构清晰，可作多架构构建的参考模板。

# 功能与动机

PR body 指出两个问题：一是 nightly 工作流仅为 linux/amd64 构建，无法在 ARM 主机（Grace、GB200/GB300 头节点、Apple Silicon 开发机）上拉取；二是发布的镜像在启动时因缺少 libpcre2-8.so.0 而崩溃。dynamo-tokenizers 依赖 pcre2-sys，后者在运行 bookworm 的构建器中动态链接系统 libpcre2，而运行时使用 distroless/cc-debian12 不提供该库。

# 实现拆解

1. **CI 工作流改造 **（`.github/workflows/nightly-experimental-sgl-router-docker.yml`）：
 - 将单个 `publish` job 拆分为 `build`（矩阵策略）和 `create-manifest` 两个 job。
 - `build` 矩阵包含两个 entry：`linux/amd64` 运行在 `ubuntu-24.04`，`linux/arm64` 运行在 `ubuntu-24.04-arm`（原生构建，无 QEMU 模拟）。
 - 每个构建使用 `--output type=image,...,push-by-digest=true` 按摘要推送，并将摘要上传为 artifact。
 - `create-manifest` job 依赖 `build`，下载各架构摘要后使用 `docker buildx imagetools create` 创建多架构 manifest 并推送到 `lmsysorg/sglang-staging:experimental-router-dev`。

2. **Dockerfile 修复 **（`docker/sgl-router.Dockerfile`）：
 - 在 `builder` 阶段添加环境变量 `ENV PCRE2_SYS_STATIC=1`，强制 pcre2-sys 使用 vendored PCRE2 并静态链接。
 - 运行时二进制仅依赖 `libstdc++.so.6`、`libgcc_s.so.1`、`libm.so.6`、`libc.so.6`，这些在 distroless/cc-debian12 中均存在。
 - distroless 运行时阶段无需改动。

3. **验证**：
 - 本地构建 arm64 镜像后 `sgl-router --help` 正常启动。
 - `readelf -d` 显示运行时二进制无 `libpcre2` NEEDED 条目。
 - `actionlint`（含 shellcheck）和 `pre-commit` 通过。

关键文件：
- `.github/workflows/nightly-experimental-sgl-router-docker.yml`（模块 CI 配置；类别 infra；类型 infrastructure）: 核心变更：将单架构构建改写为矩阵构建（amd64/arm64），并通过 digest 和 manifest 实现多架构推送。
- `docker/sgl-router.Dockerfile`（模块 Docker 配置；类别 infra；类型 infrastructure）: 修复运行时崩溃：设置 PCRE2_SYS_STATIC=1 环境变量，强制静态链接 PCRE2，消除对系统 libpcre2 的依赖。

关键符号：未识别


# 评论区精华

该 PR 只有 1 条来自 gemini-code-assist[bot] 的评论，提示达到每日配额限制，未涉及实际代码讨论。无 review 评论。

- 暂无高价值评论线程

# 风险与影响

- 风险：风险较低。变更限于 CI 工作流和 Dockerfile，不涉及任何源代码逻辑。主要风险点：
 - 若 `ubuntu-24.04-arm` runner 不可用或行为不一致，arm64 构建可能失败。
 - `PCRE2_SYS_STATIC=1` 可能在未来 pcre2-sys 版本中不再被支持或行为变化。
 - 依赖 digest 的 artifact 上传 / 下载如果存在竞态或不一致，可能导致 manifest 创建失败。
 - 影响：**用户**：sgl-router 镜像现可在 ARM64 主机上拉取使用；先前因启动崩溃无法使用的 distroless 镜像现可正常工作。
**系统**：CI 构建时间略有增加（两次构建 + manifest 创建），但并行执行影响有限。
**团队**：后续维护者需关注 matrix runner 可用性和 pcre2-sys 构建行为变化。

- 风险标记：CI runner 依赖 , 第三方库构建行为

# 关联脉络

- 暂无明显关联 PR