fix(images): minimize ql3 runtime base

This commit is contained in:
whyour
2026-08-22 12:44:49 +08:00
parent ca8ddf34b8
commit f1cca9a3ed
13 changed files with 119 additions and 40 deletions
@@ -11,8 +11,9 @@
> ADR-0196 已把该供应链扩展为 `control|admin|local` 三个 profile,并将唯一
> 发布入口迁移到 `.github/workflows/ql3-image-release.yml`。本 ADR 以下
> control/admin 数字保留为建立该机制时的历史证据。ADR-0254 随后删除 control/admin 可覆盖的
> `NODE_IMAGE` build arg将两个 build/runtime stage 与 local 一起固定到同一 Node 多架构 digest,并增加六矩阵
> OS vulnerability pre-publish gate。
> `NODE_IMAGE` build arg并增加跨架构 OS vulnerability pre-publish gate。2026-08-22 的 ADR-0254 修订进一步把
> build stage 保留在固定 Bookworm digest、runtime stage 切到零 HIGH/CRITICAL 的固定 Alpine 3.23 digest,覆盖
> `control|control-ai|admin|local|worker` 十个 native image。
## 背景
@@ -19,18 +19,19 @@ commit SHA。D-237 不能用 movable `@v0.x` 或 `latest` 引入一个拥有 wor
## 决策
1. control、admin、local 的 build/runtime stage 统一固定
`node:24.18.0-bookworm-slim@sha256:6f7b03f7c2c8e2e784dcf9295400527b9b1270fd37b7e9a7285cf83b6951452d`
control/admin 删除 `ARG NODE_IMAGE`,不得允许 build arg 覆盖 base;三个镜像继续拥有独立 Dockerfile、应用闭包和
最终 image digest。
1. control、control-ai、admin、local、worker 的 dependency/build stage 固定
`node:24.18.0-bookworm-slim@sha256:6f7b03f7c2c8e2e784dcf9295400527b9b1270fd37b7e9a7285cf83b6951452d`,最终 runtime stage 固定更小的
`node:24.18.0-alpine3.23@sha256:595398b0081eacda8e1c4c5b97b76cd1020e4d58a8ebcb4843b9bca1e79e7436`
control/admin 删除 `ARG NODE_IMAGE`,所有 runtime base 都不得由 build arg 覆盖;四个 Dockerfile 继续拥有独立应用闭包和
最终 image digest。构建与运行基座分离,避免把编译工具链和 Bookworm 的 Perl/util-linux/ncurses 包带入低配设备与集群运行镜像。
2. scanner 固定为 Trivy `v0.70.0`GitHub Action 固定完整 commit
`ed142fd0673e97e23eac54620cfb913e5ce36c25`action `v0.36.0`)。禁止 tag、`master``latest`
`continue-on-error` 和 scanner cache;网络、release asset 或 vulnerability DB 不可用均失败关闭。
3. 只扫描 `vuln-type=os``scanners=vuln`、severity `HIGH,CRITICAL``ignore-unfixed=false`、exit code 1。
npm/library advisory 继续由既有 production dependency audit 独立负责,不能用 OS 例外隐藏应用依赖漏洞。
4. `.github/workflows/ql3-ci.yml` 复用已经存在的 native buildcontrol/admin 各 amd64+arm64local
amd64+arm64,共个真实本地 image。每个 build 后生成 image-scoped ignore view 并执行 Trivy。
5. release workflow 增加独立只读 `os-vulnerability` 矩阵 job,在发布前用 exact Dockerfile、base digest、lock 和
4. `.github/workflows/ql3-ci.yml` 复用已经存在的 native buildcontrol、control-ai、admin、local、worker
amd64+arm64,共个真实本地 image。每个 build 后生成 image-scoped ignore view 并执行 Trivy。
5. release workflow 增加独立只读 `os-vulnerability` 矩阵 job,在发布前用 exact Dockerfile、base digest、lock 和
source revision 构建 native candidate。`publish` 必须同时依赖 D-236 private evidence 与全部 OS scan 成功,
才能获得 GHCR/OIDC/attestation 写权限。scan job 不读取 D-236 私密 source,不参与签名或 publish。
6. 唯一例外事实源为 `deploy/containers/ql3-os-vulnerability-exceptions.json`。顶层和每条 entry 都是 exact shape
@@ -83,9 +84,9 @@ commit SHA。D-237 不能用 movable `@v0.x` 或 `latest` 引入一个拥有 wor
- image release contract 34/34:新增覆盖 CI/release action pin、六矩阵、publish dependency、unfixed、OS-only、
cache 与既有签名/SBOM/provenance 门;
- Cluster deployment 31/31,包含 control/admin mutable/overridable base 负向测试;
- 本机 arm64 exact Dockerfile build 已通过:control `sha256:58ca2905c6489d3051663804f07adb0ea24dce734cc96863f882c8e5cb73579c`
admin `sha256:79f8eda7194cf63669ba144917eabecd11faa0546858ac1feb7ee52ccffc5f27`,均为 arm64、
`10001:10001`;验证 image 已删除
- 2026-08-22 CI 的 Bookworm runtime 扫描在 amd64/arm64 同时发现 30 个 HIGH/CRITICAL;同版 Trixie Slim 为 51 个,
Debian 13 distroless 为 1 个无修复 HIGH。固定的 Alpine 3.23 multiarch digest 使用同一 Trivy 0.70.0 与同一数据库扫描,
amd64/arm64 均为 0 HIGH/CRITICAL,且 Node 版本仍为 24.18.0;完整十镜像远端扫描仍是合并门
- `audit:image-release:ql3` 返回 Trivy 0.70.0、exact action commit、amd64/arm64、OS-only、HIGH/CRITICAL、
`ignoreUnfixed=false`、maximum exception 30 days
- 当前 policy `exceptionCount=0`workspace 保持 19 个 package,无新增 runtime dependency。