执行摘要
- 一句话:修复 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 不提供该库。
实现拆解
-
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。
-
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 运行时阶段无需改动。
-
验证:
- 本地构建 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 评论。
风险与影响
关联脉络
参与讨论