我想要运行 trivy sbom 生成器来生成一些图像,并将其从 Azure DevOps 管道推送到 Azure 容器注册表。
我的任务看起来像
- task: AzureCLI@2
inputs:
azureSubscription: 'MySubscription'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
az acr login --name ACR_Name
docker run --rm -v $(System.DefaultWorkingDirectory):/src aquasec/trivy image --format cyclonedx --output /src/sbom.json ACR_Name.azurecr.io/IMAGENAME:latest
不幸的是,它不能这样工作,但例外情况是
2024-11-12T12:24:45Z FATAL 致命错误图像扫描错误:扫描错误:无法初始化扫描仪:无法初始化图像扫描仪:无法在 [“docker” “containerd” “podman” “remote”] 中找到指定的图像“ACR_NAME/IMAGENAME:latest”:发生了 4 个错误:
- docker 错误:无法检查映像 (...):无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。docker 守护程序是否正在运行?
- containerd 错误:未找到 containerd 套接字:/run/containerd/containerd.sock
- podman 错误:无法初始化 Podman 客户端:未找到 podman 套接字:stat podman/podman.sock:没有此文件或目录
- 远程错误:GET https://ACR_NAME/oauth2/token?scope=repository%3A...%3Apull&service=...: UNAUTHORIZED:需要身份验证,请访问 https://aka.ms/acr/authorization了解更多信息。
同时,我可以docker pull IMAGENAME
按预期从此脚本内部运行。我甚至尝试在运行 trivy 之前运行它,但它似乎不使用本地图像(结果完全相同)
是否有可能在容器内部“传递”授权?
根据此处的文档
您应该创建具有 AcrPull 权限的服务主体
然后您需要以下凭证:
你应该能够按照这种方式运行它:
我假设您将凭证存储在链接到管道的变量组中的秘密中。
如果您想在代理上安装 trivy 而不是使用 docker 镜像,您可以查看本教程。
稍微扩展一下@Krzysztof Madej 的回答 - 如果您已经在 AzureCLI 任务中运行它,并且具有可以从私有存储库中提取图像的服务连接,则无需创建单独的服务主体。
此任务有一个
addSpnToEnvironment
选项,它将连接详细信息公开为环境变量,并且如果您打算仅使用这些图像进行扫描,则无需使用 cli 登录到汽车: