IBM Cloud Container Registryで、コンテナイメージの世代管理をしてみよう

# はじめに

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は、コンテナの世代を、タグの文字列などではなく、<b>ビルド日時を見て判定する</b>ようなので、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
```

[^1]: IBM Cloud CLI のコンテナ版を使用している場合は、コンテナ上からコンテナホストのDockerを利用する必要があります。`docker run` する際に、`-v /var/run/docker.sock:/var/run/docker.sock` を引数につけてあげるとうまくいくと思います。

これで準備ができました。

# 機能検証

## 手動削除

まず、手動で古い世代のコンテナイメージ削除（指定世代より古い世代のイメージ削除）を試してみます。

基準を満たすイメージのみ保持することにより名前空間をクリーンアップする
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
``` 

<b>ポリシー設定時点で、ポリシーに守られていないイメーが削除されてしまいました。</b>

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 は 記事執筆時点で、使用ストレージ容量でも課金される（＋プルトラフィック課金）ので、使用ストレージを節約できる本機能はありがたいですね。