azure - 是否有 VSTS 构建任务可以从注册表中删除未使用的 Docker 容器?

标签 azure docker azure-devops docker-registry azure-pipelines-build-task

问题

我在 Azure 上有一个 Docker 容器注册表,其中一个容器包含多个标记版本。我想删除未使用的标签,因为它们占用了大量空间并且可以随时重新制作。

原因

此 Docker 容器注册表存在的唯一原因是 VSTS 如何处理 Docker 容器的构建和发布。运行 VSTS 构建时,它会使用新标签将容器存储在 Azure 上的注册表中。并非所有版本都会发布,因此可以安全地删除这些标签。

VSTS 非常干净地管理构建,如果 30 天后不使用它们(默认情况下),则会将其删除;不过,一旦推送到 Docker 容器注册表,即使没有匹配的 VSTS 构建,它们也会无限期地保留在那里。

问题

如何创建一个任务来从注册表中删除不再与 VSTS 中的构建关联的 Docker 容器?

注意:容器标签与 VSTS 的 buildId 匹配

最佳答案

由于没有 VSTS 任务来完成此任务,因此您需要执行几个步骤来生成一些 JSON 数据文件,然后处理该数据并通过 Azure CLI 运行一些 cmd 命令。

构建

您需要从 VSTS 获取构建定义 ID。该链接看起来像这样:

https://example.visualstudio.com/CP/Example%20Team/_build/index?context=mine&path=%5C&definitionId=11&_a=completed

在本例中,定义 ID 为 11:definitionId=11

获得定义 ID 后,使用此 URL 查询 API 并获取仅事件构建的列表。此链接不包括已删除的版本:

https://companionprotect.visualstudio.com/CP/_apis/build/builds?deletedFilter=exclude&definitions=BUILD_DEFINITION_ID

标签

az login
az acr login --name {REGISTRY_NAME}
az acr repository show-tags --repository {CONTAINER_NAME} --output json > tags.json

删除未使用的 Docker 容器标签

处理数据后,您可以创建运行以下命令的批处理文件:

az acr repository delete --yes --repository companionconnectclient_web --tag {TAG_NAME}

如果您想在 cmd 文件中运行多个命令,请在每个命令之间放置 & ^ 以便在每个命令完成后继续执行,否则只会执行第一个命令一。您也可以在换行符末尾使用 & ^

关于azure - 是否有 VSTS 构建任务可以从注册表中删除未使用的 Docker 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48773679/

相关文章:

azure - 使用私有(private)注册表中的镜像进行 k8s 部署

docker - 无法使用 Ctrl-C 停止我的 Docker 容器

Azure 门户显示错误的服务主体对象 ID

azure - Manage.windowsazure 和 Portal.azure 之间有什么区别?

asp.net - 如何使用暂存槽管理 Azure 应用服务中的 robots.txt

azure - Microsoft Azure 辅助角色执行控制

azure - 使计时器触发功能 cron 可从 Azure DevOps 发布管道进行配置

azure - 访问 Azure Devops YAML Pipeline 中的容器资源变量

docker - GCE 未正确部署 GCR 镜像

azure - 从 Visual Studio Team Services (VSO) 部署 Azure WebApp