はじめに
IBM Cloud で使用可能な、コンテナレジストリ IBM Cloud Container Registry(ICCR)で、古いコンテナイメージを削除したい、という要望があったので、公式マニュアルに記載されていた「名前空間のクリーンアップ」機能を試してみました。
説明
IBM Cloud Container Registry
IBM Cloud™ Container Registry には、コンテナー・イメージを保管して、それをお客様の IBM Cloud アカウントに属する他のユーザーと共有するために使用できる、マルチテナントのプライベート・イメージ・レジストリーが用意されています。
サービスページ
https://cloud.ibm.com/kubernetes/catalog/registry
公式マニュアル
https://cloud.ibm.com/docs/Registry?topic=Registry-getting-started
名前空間のクリーンアップ機能
IBM Cloud™ Container Registry の名前空間にある各リポジトリー内に最新イメージのみを保持することによって、その名前空間をクリーンアップすることができます。 タグの外されたイメージを削除するか保持するかを選択することもできます。
同じイメージの最新イメージ以外の古いバージョンのイメージの削除や、タグが外された不要イメージの自動削除ができるようです。
公式マニュアル
https://cloud.ibm.com/docs/Registry?topic=Registry-registry_retention
環境準備
まず IBM Cloud Container Registry に 同じイメージを4世代分アップロードしていきます。
IBM Cloud CLIの導入
このあたりを参照してください。
https://cloud.ibm.com/docs/cli?topic=cli-getting-started
container-registry CLI プラグインの導入
こちらも、このあたりを参照してください
https://cloud.ibm.com/docs/Registry?topic=Registry-registry_setup_cli_namespace#cli_namespace_registry_cli_install
ここでログインと、ICCRのRegionをセットしておきます。
$ ibmcloud cr login
Logging in to 'jp.icr.io'...
Logged in to 'jp.icr.io'.
$ ibmcloud cr region-set ap-north
The region is set to 'ap-north', the registry is 'jp.icr.io'.
OK
$ ibmcloud cr info
Container Registry jp.icr.io
Container Registry API endpoint https://jp.icr.io/api
IBM Cloud API endpoint https://cloud.ibm.com
IBM Cloud account details xxxxxxxx (xxxxxxxx)
IBM Cloud organization details ()
名前空間の作成
ICCRの名前空間(Namespace)を作成します。
ICCRの名前空間の命名には、以下の制約がありますのでご注意ください。(別アカウントで用意した開発環境と本番環境で、同じ名前の名前空間を作ろうとして挫折しました)
名前空間は、同じリージョン内のすべての IBM Cloud アカウントにおいて固有でなければなりません。 名前空間は 4 文字から 30 文字までで、含めることができるのは、小文字、数字、ハイフン (-)、下線 (_) のみです。 名前空間は、文字または数値で開始および終了する必要があります。
$ ibmcloud cr namespace-add ns_kentarok
Adding namespace 'ns_kentarok' in resource group 'rg_kentarok' for account xxxxxxxx in registry jp.icr.io...
Successfully added namespace 'ns_kentarok'
コンテナイメージのアップロード
まず、ローカルに適当に4世代 4つのコンテナイメージを用意してください。ICCRは、コンテナの世代を、タグの文字列などではなく、ビルド日時を見て判定するようなので、4回ビルドしてあげてください。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
kentaroktest v4 7e697e567280 4 minutes ago 1.22MB
kentaroktest v3 e8087b476ac8 4 minutes ago 1.22MB
kentaroktest v2 a2910fb3abdc 4 minutes ago 1.22MB
kentaroktest v1 d1d101ca4995 5 minutes ago 1.22MB
以下に書かれている書式でコンテナイメージの名前(レポジトリ)を調整します。
名前空間で使用する Docker イメージのビルド
https://cloud.ibm.com/docs/Registry?topic=Registry-registry_images_#registry_images_creating
$ docker tag kentaroktest:v1 jp.icr.io/ns_kentarok/kentaroktest:v1
$ docker tag kentaroktest:v2 jp.icr.io/ns_kentarok/kentaroktest:v2
$ docker tag kentaroktest:v3 jp.icr.io/ns_kentarok/kentaroktest:v3
$ docker tag kentaroktest:v4 jp.icr.io/ns_kentarok/kentaroktest:v4
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
kentaroktest v4 7e697e567280 7 minutes ago 1.22MB
jp.icr.io/ns_kentarok/kentaroktest v4 7e697e567280 7 minutes ago 1.22MB
kentaroktest v3 e8087b476ac8 7 minutes ago 1.22MB
jp.icr.io/ns_kentarok/kentaroktest v3 e8087b476ac8 7 minutes ago 1.22MB
kentaroktest v2 a2910fb3abdc 7 minutes ago 1.22MB
jp.icr.io/ns_kentarok/kentaroktest v2 a2910fb3abdc 7 minutes ago 1.22MB
kentaroktest v1 d1d101ca4995 8 minutes ago 1.22MB
jp.icr.io/ns_kentarok/kentaroktest v1 d1d101ca4995 8 minutes ago 1.22MB
ローカルに作った コンテナイメージを ICCRにアップロードします。1
まず、今、ICCRが空っぽなのを確認してから・・・
$ ibmcloud cr image-list
Listing images...
You have no images in the namespaces for this account, or you are not authorized to view any namespaces for this account.
Push an image, ensure that the IAM access policy for this account grants you Reader or Manager access to at least one namespace.
To see IBM-provided images, target the global registry using 'ibmcloud cr region-set global' and then run 'ibmcloud cr image-list --include-ibm'.
アップロードします。
$ docker push jp.icr.io/ns_kentarok/kentaroktest:v4
$ docker push jp.icr.io/ns_kentarok/kentaroktest:v3
$ docker push jp.icr.io/ns_kentarok/kentaroktest:v2
$ docker push jp.icr.io/ns_kentarok/kentaroktest:v1
# ibmcloud cr image-list
Listing images...
Repository Tag Digest Namespace Created Size Security status
jp.icr.io/ns_kentarok/kentaroktest v1 34e5ea5b2623 ns_kentarok 12 minutes ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v2 7ea001c61ddb ns_kentarok 12 minutes ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v3 5450cf2447e6 ns_kentarok 12 minutes ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v4 c3d306d70e0e ns_kentarok 12 minutes ago 764 kB Unsupported OS
これで準備ができました。
機能検証
手動削除
まず、手動で古い世代のコンテナイメージ削除(指定世代より古い世代のイメージ削除)を試してみます。
基準を満たすイメージのみ保持することにより名前空間をクリーンアップする
https://cloud.ibm.com/docs/Registry?topic=Registry-registry_retention#retention_images
過去4世代までは保存、を実行してみます。
$ ibmcloud cr retention-run --images 4 ns_kentarok
Retrieving images to delete from namespace 'ns_kentarok' in registry jp.icr.io'...
Found 0 images to delete.
OK
期待値通り、イメージは削除されませんでした。
次に、過去3世代までは保存(4世代より前は削除)を試してみます、
$ ibmcloud cr retention-run --images 3 ns_kentarok
Retrieving images to delete from namespace 'ns_kentarok' in registry jp.icr.io'...
Image Tags
jp.icr.io/ns_kentarok/kentaroktest@sha256:34e5ea5b2623b225508b9d0a6d3b113416fdd4811479eff05335a560891bd340 v1
Found 1 images to delete.
Do you want to continue and delete the images? [y/N]> y
Deleting 1 images...
Successfully deleted 1 images.
OK
ちゃんと確認の上、消してくれました。実際に、image-listを取得してみても削除されています。
$ ibmcloud cr image-list
Listing images...
Repository Tag Digest Namespace Created Size Security status
jp.icr.io/ns_kentarok/kentaroktest v2 7ea001c61ddb ns_kentarok 20 minutes ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v3 5450cf2447e6 ns_kentarok 20 minutes ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v4 c3d306d70e0e ns_kentarok 20 minutes ago 764 kB Unsupported OS
OK
自動削除
次に自動削除(保管ポリシーを設定しておいて、定期的に指定世代より古いイメージを削除する)を試してみます。
基準を満たすイメージのみを保存するように名前空間に保持ポリシーを設定する
https://cloud.ibm.com/docs/Registry?topic=Registry-registry_retention#retention_policy_set
以下のコマンドで retention-policy
を 2 (2世代まで保管、それ以上古いものは削除)に設定します。(このあたり、IBM Cloud Cliの文法が統一されていなくて、辛い・・・)
# ibmcloud cr retention-policy-set --images 2 ns_kentarok
Image Tags
jp.icr.io/ns_kentarok/kentaroktest@sha256:34e5ea5b2623b225508b9d0a6d3b113416fdd4811479eff05335a560891bd340 v1
jp.icr.io/ns_kentarok/kentaroktest@sha256:7ea001c61ddb74a626d56d70acd71482035f03b86ebb006a6e3c37cea47e6a38 v2
Found 2 images to delete.
If you set this policy, the selected images are deleted immediately according to the rules that you set in your policy. Deleted images are moved to your trash and can be restored for 30 days. Do you want to continue to set the policy? [y/N]> y
Deleting 2 images...
Successfully deleted 2 images.
OK
A scheduled retention policy is set that keeps 2 images in each repository in ns_kentarok and retain-untagged is set to false.
OK
ポリシー設定時点で、ポリシーに守られていないイメーが削除されてしまいました。
retention-policy を確認します。
# ibmcloud cr retention-policy-list
Listing image retention policies for account 'IBM - Cloud Delivery' in registry 'jp.icr.io'...
Namespace Images to retain Retain all untagged
ns_kentarok 2 false
OK
自動で削除されていることを確認するために、新しくビルドした v5 をアップロードしておきました。
$ docker push jp.icr.io/ns_kentarok/kentaroktest:v5
(省略)
$ ibmcloud cr image-list
Listing images...
Repository Tag Digest Namespace Created Size Security status
jp.icr.io/ns_kentarok/kentaroktest v3 5450cf2447e6 ns_kentarok 50 minutes ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v4 c3d306d70e0e ns_kentarok 50 minutes ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v5 559b18fd1a5f ns_kentarok 1 minute ago 764 kB Unsupported OS
処理は日次で実行されるらしいので、一日待ってみましょう。
ポリシーは設定直後に実行されますが、その後は日次で実行されます。 設定できるポリシーは、名前空間ごとに 1 つだけです。
https://cloud.ibm.com/docs/Registry?topic=Registry-registry_retention#retention_policy_set
・・・二日経ちました・・・。( Created
が 2 days ago
になってるのでバレる)
ちゃんと最新2世代より古い v3のタグをもったコンテナイメージが削除されていることがわかります。
$ ibmcloud cr image-list
Listing images...
Repository Tag Digest Namespace Created Size Security status
jp.icr.io/ns_kentarok/kentaroktest v4 c3d306d70e0e ns_kentarok 2 days ago 764 kB Unsupported OS
jp.icr.io/ns_kentarok/kentaroktest v5 559b18fd1a5f ns_kentarok 2 days ago 764 kB Unsupported OS
OK
ゴミ箱機能
本機能で削除されたコンテナイメージは、即本当に削除されるわけではなく、ゴミ箱に30日保管されるようです。ゴミ箱を覗いてみましょう。
$ ibmcloud cr trash-list
Listing the contents of the trash...
Digest Days until expiry Tags
jp.icr.io/ns_kentarok/kentaroktest@sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 30 v4, v3
jp.icr.io/ns_kentarok/kentaroktest@sha256:34e5ea5b2623b225508b9d0a6d3b113416fdd4811479eff05335a560891bd340 30 v1
jp.icr.io/ns_kentarok/kentaroktest@sha256:7ea001c61ddb74a626d56d70acd71482035f03b86ebb006a6e3c37cea47e6a38 30 v2
まとめ
IBM Cloud Container Registryの 名前空間のクリーンアップ機能を試してみました。
ICCR は 記事執筆時点で、使用ストレージ容量でも課金される(+プルトラフィック課金)ので、使用ストレージを節約できる本機能はありがたいですね。
-
IBM Cloud CLI のコンテナ版を使用している場合は、コンテナ上からコンテナホストのDockerを利用する必要があります。
docker run
する際に、-v /var/run/docker.sock:/var/run/docker.sock
を引数につけてあげるとうまくいくと思います。 ↩