G-gen の堂原です。 Artifact Registry に溜まった、タグなしの Docker イメージ ダイジェストを一括で削除する Python プログラムを紹介します。
はじめに
Google Cloud (旧称 GCP) の Artifact Registry では、同じタグのイメージがプッシュされると、古いイメージ ダイジェストはタグが外されタグなしの状態となり保管されます。 このイメージ ダイジェストは勝手に消えないため、気づくとタグなしイメージ ダイジェストだらけになることもあるかと思います。
現在こういったイメージ ダイジェストを自動で削除するような機能は、プレビュー版としては一部のユーザには提供されているものの、一般公開されていません。(ドキュメント)
そこで今回は、作成されてから一ヶ月以上経過したタグなし Docker イメージ ダイジェストを一括削除する Python プログラムを紹介します。
本記事では実施していませんが、本コードを Cloud Functions にデプロイして、Cloud Scheduler で定期実行するなどといった運用が考えられます。
ソースコードの解説
処理の流れ
本プログラムの処理の流れは以下のようになります。
list_tags
関数でタグ情報一覧を取得する- タグが付いている全てのイメージ ダイジェスト名を取得
list_versions
関数で全てのイメージ ダイジェスト情報を取得- タグが付いていないイメージ ダイジェストを判断
- イメージ ダイジェストの作成日を確認
- 基準時間よりも古ければ、
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にも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。
Follow @ryu_dohara