在ci流程中用trivy自动拦截高危镜像,需将扫描嵌入构建完成、推送前环节,配置--severity critical,high、--exit-code 1实现失败阻断,并通过.trivyignore管理豁免,修复后须验证total: 0。

在CI流程中用Trivy自动拦截高危镜像,关键不是“装个插件”,而是把扫描动作嵌入构建环节,并配置明确的失败策略。Trivy本身是命令行工具,不依赖Docker插件,直接调用即可生效。
在CI中触发Trivy扫描的时机
扫描必须发生在镜像构建完成、推送仓库之前。早于这一步,镜像还不存在;晚于这一步,漏洞镜像已入库,拦截失去意义。
- GitHub Actions:在
docker build步骤后立即执行trivy image my-app:latest - GitLab CI:在
build阶段完成后,新增security-scan阶段,使用aquasec/trivy镜像运行扫描 - Jenkins Pipeline:在
sh 'docker build -t ...'之后添加sh 'trivy image ...'步骤
设置高危漏洞阻断逻辑
仅扫描不阻断等于没做。必须让Trivy在发现CRITICAL或HIGH漏洞时返回非零退出码,使CI任务失败。
- 加
--severity CRITICAL,HIGH限定只关注这两级 - 加
--exit-code 1确保有匹配漏洞就中断流水线 - 加
--ignore-unfixed避免因无修复版本的漏洞误报导致阻断(可选) - 示例命令:
trivy image --severity CRITICAL,HIGH --exit-code 1 --ignore-unfixed my-app:latest
处理误报与临时豁免
完全不允许可疑漏洞可能拖慢交付节奏。对确认无风险的漏洞,可用.trivyignore文件管理豁免。
- 在项目根目录创建
.trivyignore,每行写一个CVE ID - 每条忽略项建议附简短注释,说明原因和有效期,例如:
CVE-2023-12345 # 容器内无对应攻击面,2026-Q3复核 - CI中通过
--ignore-file .trivyignore参数启用该文件
验证修复是否真正生效
修复后不能只靠“感觉”,要让扫描结果成为闭环依据。
- 升级基础镜像(如从
debian:11换为debian:12-slim)或显式更新包(如apt-get install -y openssl=1.1.1n) - 重新构建镜像,再次运行相同Trivy命令
- 确认输出中
Total: 0且无CRITICAL/HIGH条目,再允许进入推送或部署阶段











