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

Is there a VSTS build task to remove unused Docker containers from the registry?

问题

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

原因

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

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

问题

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

注意: 容器标签匹配 VSTS 的 buildIds

不,VSTS 中没有这样的内置任务,您可以尝试编写一些脚本来绕过此限制,但它可能不会完全直接,因为无法在其中获取您想要的数据构建本身,因此您必须查询 VSTS api 才能获取它。

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

建造

您需要从 VSTS 获取生成定义 ID。 link 看起来像这样:

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

在这种情况下,定义 id 是 11definitionId=11

获得定义 ID 后,使用此 URL 查询 API 并获取仅活动构建的列表。此 link 不包括已删除的构建:

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 文件中执行多个命令,请在每个命令之间放置 & ^ 以使其在每个命令完成后继续执行,否则它只会执行第一个命令.您也可以在换行符末尾使用 & ^