当我们将具有与现有镜像相同标签的容器镜像推送到 Google Artifact Registry 时,现有镜像上的标签会被移除,留下一个没有标签的镜像。

[GCP 未标记图像](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 来触发您的构建。

如果这篇文章对您有帮助或者您有更好的解决方案,我很想听听。

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐