删除 Google Artifact Registry 上未标记的图像
当我们将具有与现有镜像相同标签的容器镜像推送到 Google Artifact Registry 时,现有镜像上的标签会被移除,留下一个没有标签的镜像。 [](https://res.cloudinary.com/practicaldev/image/fetch/s--hZrl_1Xo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/htt
当我们将具有与现有镜像相同标签的容器镜像推送到 Google Artifact Registry 时,现有镜像上的标签会被移除,留下一个没有标签的镜像。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--hZrl_1Xo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/83k13rj9m7ktvemdow2q.png)
所有图像都会占用空间并计入您的账单。假设您没有使用未标记的图像,如果我们可以一次删除所有这些图像不是很好吗?
现有解决方案
与亚马逊的 ECR 生命周期政策不同,目前没有白手套(官方)方式在 GCP 上执行此操作。但我们有选择。
我已经看到了一些解决此问题的方法,特别是GCR Cleaner,它在 Google 的 Container Registry 的官方文档中有所提及。在这个Stack Overflow 问题中也有一些很好的方法。
阅读这些方法,看看它们是否适合您的用例。
我的解决方案
我的解决方案使用带有少量 PowerShell 和 shell 脚本的 Cloud Build 和 Cloud Scheduler。它比上面提到的解决方案要简单一些,但效果很好。
以下命令适用于 Google Cloud Artifact Registry(不要与 Container Registry 混淆)。您可以轻松修改下面的
gcloud
命令以适应后者。
先决条件
-
具有 Cloud Build Editor 角色的 Cloud Scheduler 作业的服务帐户,以便它可以触发构建。
-
您的 Cloud Build 服务帐户应该已经有权列出项目中的工件注册表映像,但您可能需要为其提供额外的
artifactregistry.versions.delete
权限。 -
包含以下 2 个文件的 git 存储库,作为源添加到您的 Cloud Build 触发器。
云构建脚本
将 Cloud Build 触发器中的_REPO
替换变量设置为您要清理的映像存储库,例如:
us-central1-docker.pkg.dev/my-project/my-container-apps
# cloudbuild.yaml
steps:
- id: List untagged images
name: gcr.io/cloud-builders/gcloud
entrypoint: sh
args:
- -c
- |
gcloud artifacts docker images list $_REPO --include-tags \
--filter='-tags:*' --format=json > untagged.json
cat untagged.json
- id: Format list of untagged images
name: mcr.microsoft.com/powershell
entrypoint: pwsh
args:
- ./New-UntaggedImageList.ps1
- id: Delete untagged images
name: gcr.io/cloud-builders/gcloud
entrypoint: sh
args:
- -c
- |
if test -f clean.txt; then
while read i; do
gcloud artifacts docker images delete --quiet "$i"
done < clean.txt
else
echo "No untagged images."
fi
进入全屏模式 退出全屏模式
如果您精通 shell 脚本,您可能会省略上面的 PowerShell 步骤,并在最后一步中通过一些 JSON 解析来充实 shell 脚本。与我的方法相比,这更干净,因为它不需要写入文件系统和额外的构建步骤。但我发现 PowerShell 在处理gcloud
省略的 JSON 时更好用。
PowerShell 脚本
PowerShell 脚本获取我们的untagged.json
,对其进行解析,将每个包和摘要 (sha256) 连接成一行中的字符串,并将其附加到文本文件中。如果 JSON 文件为空(i.e.,没有未标记的图像),则跳过此步骤。
# New-UntaggedImageList.ps1
$UntaggedImages = Get-Content untagged.json | ConvertFrom-Json
If ($UntaggedImages) {
$UntaggedImages | ForEach-Object {
$p, $v = $_.package, $_.version
Add-Content clean.txt "$p`@$v"
}
} Else {
Write-Host 'No untagged images.'
}
进入全屏模式 退出全屏模式
结束
我将我的 Cloud Scheduler 作业频率设置为33 15 * * 4
,因此它在我的时区的星期四 15:33 每周运行一次。您当然可以将这些步骤集成到现有的构建中,而不是使用 Cloud Scheduler 来触发您的构建。
如果这篇文章对您有帮助或者您有更好的解决方案,我很想听听。
更多推荐
所有评论(0)