GCPのGoogle Container Registryのイメージを一括削除する方法

Docker,GCP,Kubernetes

はじめに

GCP上の Google Container Registry 内に不要なDockerイメージがあるため、削除したいと思いました。

Dockerイメージを削除するためには、すべてのタグ(というかハッシュ。ビルド履歴)を削除する必要がありmさう。

対象のDockerイメージに4000以上のタグが付与されているため、できる限り一括かつ並列で削除擦る方法を探してみました。

検証環境

$ uname -moi
x86_64 MacBookPro16,1 Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.0.17(1)-release (x86_64-apple-darwin19.4.0)

$ xargs --version | head -n 1
xargs (GNU findutils) 4.7.0

準備

GCP上のリソースをコマンドラインから操作するためのツールとして gcloud コマンドがあります。
事前にこちらのコマンドをインストールし、 gcloud auth login などで認証を完了しておきましょう。

正しく準備ができていれば、以下のコマンドが動作するはずです。

# Google Container Registryからイメージの一覧を取得
$ gcloud container images list

結果

準備ができれば、後は以下のコマンドを実行するだけです。
以下の2つの環境変数はご自分のGCP設定に合わせて書き換えてください。

  • GCP_PROJECT_ID
  • GCP_DOCKER_IMAGE_NAME
$ GCP_PROJECT_ID=YOUR_GCP_PROJECT_ID

$ GCP_DOCKER_IMAGE_NAME=gcr.io/${GCP_PROJECT_ID}/YOUR_DOCKER_IMAGE_NAME

$ gcloud \
  container images list-tags ${GCP_DOCKER_IMAGE_NAME} \
  | sed 1d \
  | awk '{ print $1 }' \
  | xargs -P4 -n 1 -I{} gcloud container images delete ${GCP_DOCKER_IMAGE_NAME}@sha256:{} --quiet --force-delete-tags

ここでは、 xargs-P パラメータで 4並列実行しています
マシンリソースに自身があるなら -P0 として、CPUを目一杯使うことができます。

ひとこと

きっと、もっとスマートに削除する方法があると思います。

Docker,GCP,Kubernetes