将漏洞扫描嵌入 docker compose 流程需分阶段选工具:构建后用 trivy 扫描中断带病镜像、推送后靠 docker scout 或 anchore 监听 registry、运行时用 vuls 定时巡检;通过独立 scanner 服务声明、ci 中 docker compose run 执行、sarif 输出及自动修复闭环实现安全左移。

直接把漏洞扫描嵌进 Docker Compose 启动流程里,不是“额外加一步”,而是让它成为构建、测试、部署中自然的一环——关键在于分清阶段、选对工具、绑定触发时机。
明确扫描所处的流程阶段
漏洞扫描不是万能胶,得放在对的位置才起效:
- 镜像构建后、推送前:用 Trivy 或 Docker Scout 扫描本地镜像,发现高危漏洞就中断构建,避免带病镜像入库
-
镜像推送到 Registry 后:借助 Docker Scout 自动触发深度分析(需打标
com.docker.scout.distribute=true),或让 Anchore Engine 监听 registry webhook 主动拉取扫描 -
运行时环境扫描:用 Vuls 定期扫描宿主机或容器内 OS 层漏洞,适合搭配
cron+docker-compose exec实现定时巡检
用 docker-compose.yml 声明扫描服务
不推荐把扫描逻辑硬塞进主应用服务,应独立为一个可复用的扫描任务服务:
- 在
docker-compose.yml中新增scanner服务,挂载待测镜像所在目录(如./build)或共享命名卷 - 使用
trivy官方镜像,通过command指定扫描目标和策略:
command: image --severity CRITICAL,HIGH --exit-code 1 --skip-update myapp:latest - 设置
depends_on确保它在构建服务完成后执行,或用profiles控制仅在 CI 场景启用:
profiles: ["scan"]
与 CI/CD 流水线联动的关键配置
Docker Compose 本身不调度任务,必须靠外部系统驱动:
- 在 Jenkins Pipeline 或 GitHub Actions 中,用
docker compose run --rm scanner替代up,确保单次执行、不常驻 - 扫描失败时,让命令返回非 0 状态码(Trivy 默认满足),CI 工具会自动标记构建失败
- 导出结果为 SARIF 格式供平台解析:
trivy image --format sarif -o report.sarif myapp:latest - 若用 Docker Scout,推送镜像时必须带上特定 label:
docker buildx build --label com.docker.scout.distribute=true -t myreg/myapp .
修复闭环不能只靠扫描
扫出来只是开始,自动化修复才是重点:
- 识别可修漏洞:Trivy 的 JSON 输出里含
FixedIn字段,可提取对应包名和修复版本 - 自动更新基础镜像:比如将
python:3.9-slim升级为python:3.9.18-slim,再重新构建 - 验证修复效果:扫描修复后的镜像,比对前后报告,确认 CVE 被清除且无新问题引入
- 打标区分安全版本:给修复后的镜像加
security-fixedtag,供后续部署流程识别放行











