如何修改Azure DevOps中Trivy扫描Pipeline以支持多容器镜像
修改Azure DevOps Pipeline以支持多容器镜像扫描
方法1:串行遍历多个镜像(简单直接)
将原Pipeline的变量和扫描步骤修改为以下内容,通过定义镜像列表并循环扫描每个镜像,生成独立的报告文件:
name: $(BuildDefinitionName)_$(date:yyyyMMdd)_$(BuildID)$(rev:.r) resources: - repo: self variables: # 用逗号分隔多个需要扫描的容器镜像(格式:镜像名:标签) container_images: 'openjdk:17-jdk-slim,nginx:alpine,ubuntu:22.04' jobs: - job: TrivyScanContainerImage displayName: Scan multiple container images by Trivy steps: - script: | # 创建报告目录 mkdir -p report # 拆分镜像列表为数组 IFS=',' read -ra IMAGE_LIST <<< "$(container_images)" # 遍历每个镜像执行扫描 for IMAGE in "${IMAGE_LIST[@]}"; do # 将镜像名中的冒号替换为短横线,避免文件名非法字符 REPORT_NAME=$(echo "$IMAGE" | tr ':' '-') # 执行Trivy扫描并保存报告 trivy image -s HIGH,CRITICAL "$IMAGE" | tee "./report/trivy-scan-${REPORT_NAME}.txt" done displayName: "Scan all container images with Trivy" continueOnError: true - publish: ./report artifact: ImageScans displayName: Publish All Scan Reports condition: always()
说明:
- 变量
container_images用于存储所有需要扫描的镜像,用逗号分隔即可快速扩展 - 每个镜像的扫描报告以
trivy-scan-镜像名-标签.txt命名,避免文件覆盖 - 所有报告最终会打包到同一个
ImageScans工件中,方便统一查看
方法2:并行扫描多个镜像(提升效率)
利用Azure DevOps的矩阵策略,为每个镜像启动独立的并行扫描任务,适合镜像数量较多的场景:
name: $(BuildDefinitionName)_$(date:yyyyMMdd)_$(BuildID)$(rev:.r) resources: - repo: self jobs: - job: TrivyScanContainerImage displayName: Scan container images by Trivy (Parallel) # 定义矩阵,每个镜像对应一个任务实例 strategy: matrix: openjdk_17_slim: target_image: 'openjdk:17-jdk-slim' nginx_alpine: target_image: 'nginx:alpine' ubuntu_2204: target_image: 'ubuntu:22.04' # 可选:限制并行任务数量,避免代理资源耗尽 maxParallel: 2 steps: - script: | mkdir -p report # 生成安全的报告文件名 REPORT_NAME=$(echo "$(target_image)" | tr ':' '-') trivy image -s HIGH,CRITICAL $(target_image) | tee "./report/trivy-scan-${REPORT_NAME}.txt" displayName: "Scan $(target_image) with Trivy" continueOnError: true - publish: ./report # 每个镜像生成独立的工件,便于区分 artifact: ImageScan-$(target_image) displayName: Publish Scan Report for $(target_image) condition: always()
说明:
- 矩阵中的每个条目对应一个镜像,任务会并行执行,大幅提升扫描速度
- 每个镜像的扫描结果会打包到单独的工件中(如
ImageScan-openjdk:17-jdk-slim),便于单独查看 - 通过
maxParallel可以控制同时运行的扫描任务数量,适配自托管代理的资源能力
内容的提问来源于stack exchange,提问作者roteki
相关产品推荐
相关产品推荐

