Artifact RegistryのタグなしDockerイメージ ダイジェストを一括削除

記事タイトルとURLをコピーする

G-gen の堂原です。 Artifact Registry に溜まった、タグなしの Docker イメージ ダイジェストを一括で削除する Python プログラムを紹介します。

はじめに

Google Cloud (旧称 GCP) の Artifact Registry では、同じタグのイメージがプッシュされると、古いイメージ ダイジェストはタグが外されタグなしの状態となり保管されます。 このイメージ ダイジェストは勝手に消えないため、気づくとタグなしイメージ ダイジェストだらけになることもあるかと思います。

現在こういったイメージ ダイジェストを自動で削除するような機能は、プレビュー版としては一部のユーザには提供されているものの、一般公開されていません。(ドキュメント

そこで今回は、作成されてから一ヶ月以上経過したタグなし Docker イメージ ダイジェストを一括削除する Python プログラムを紹介します。

本記事では実施していませんが、本コードを Cloud Functions にデプロイして、Cloud Scheduler で定期実行するなどといった運用が考えられます。

ソースコードの解説

処理の流れ

本プログラムの処理の流れは以下のようになります。

  1. list_tags 関数でタグ情報一覧を取得する
  2. タグが付いている全てのイメージ ダイジェスト名を取得
  3. list_versions 関数で全てのイメージ ダイジェスト情報を取得
  4. タグが付いていないイメージ ダイジェストを判断
  5. イメージ ダイジェストの作成日を確認
  6. 基準時間よりも古ければ、delete_version 関数で削除

ソースコード

以下がソースコードの全容となります。

#!/usr/bin/env python
 
from google.cloud import artifactregistry_v1
from datetime import datetime, timedelta
 
project_id = "${プロジェクトID}"
location = "${Artifact Registryリポジトリのリージョン}"
repository = "${リポジトリ名}"
package = "${イメージ名}"
 
def main():
    client = artifactregistry_v1.ArtifactRegistryClient()
 
    # 対象のイメージに存在する全てのタグ情報を取得
    response = client.list_tags(
        parent=f"projects/{project_id}/locations/{location}/repositories/{repository}/packages/{package}")
 
    # タグが付いている全てのイメージ ダイジェストを取得
    tag_list = []
    for tag in response:
        tag_list.append(tag.version)
 
    # 対象のイメージに存在する全てのダイジェスト情報を取得
    response = client.list_versions(
        parent=f"projects/{project_id}/locations/{location}/repositories/{repository}/packages/{package}")
 
    # 基準となる時間を取得
    now = datetime.utcnow()
    cutoff_time = now - timedelta(days=30)
 
    for version in response:
        # タグが付いているかを判断(tag_list[] に存在するかどうか)
        if version.name not in tag_list:
            create_time = version.create_time.replace(tzinfo=None)
         
            # 基準時間よりも前に作成されたか判断→削除
            if create_time < cutoff_time:
                print(f"delete: {version.name}")
                client.delete_version(name=version.name)
 
if __name__ == "__main__":
    main()

クライアントライブラリ

Python Client for Artifact Registry API

Artifact Registry の操作には Python Client for Artifact Registry API を用います。 本記事では、投稿時点の最新バージョンである 1.8.1 を用いています。

Cloud Functions 等で、requirements.txt が必要な場合は以下の通りとなります。

google-cloud-artifact-registry == 1.8.1

現在は「delete_docker_image」が存在しない

現在こちらのライブラリには 、

  • Docker イメージ(Docker イメージ ダイジェスト)一覧を取得する list_docker_images 関数
  • Docker イメージ ダイジェストの情報を取得する get_docker_image 関数

は存在しますが、Docker イメージ(あるいは Docker イメージ ダイジェスト)を削除するような関数は存在しません。

そのため list_docker_images で取得した情報に基づいて Docker イメージ ダイジェストを削除といったことができず、本記事ではこのような流れで処理を記述しました。

parent の記載方法

list_tags 関数や list_versions 関数の引数となっている parent について、最初は何を記載したら良いのかわかりませんでした。 ライブラリ紹介のページには記載がありません。

そんなときは、各サービスの API をまとめたドキュメントを調べてみてください。 Artifact Registry ならこちらのドキュメントになります。

例えばこのドキュメントにて、 REST Resource: v1.projects.locations.repositories.packages.tags を確認してもらうと、{parent=projects/*/locations/*/repositories/*/packages/*} のように parent の書き方が記載されています。

堂原 竜希(記事一覧)

クラウドソリューション部データアナリティクス課。2023年4月より、G-genにジョイン。

Google Cloud Partner Top Engineer 2023, 2024に選出 (2024年はRookie of the yearにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。