はじめに
開発したアプリケーションのコンテナイメージAzure Container Registryにしている方は多いと思います。何も管理しないでいるとどんどんコンテナイメージが増えるばかり。直近のイメージは保存しておきたいけど、不要になったイメージは削除してACRの容量を減らすことはできないだろうか。そんなことを考える方は多いと思います。
プレビュー段階ではありますが、それを実現するコマンドがMicrosoftから提供されています。
今回は実際にこちらを利用してみたいと思います。
やり方
要求仕様確認
今回実験するイメージは以下のような環境をイメージしました。
- イメージ利用先(デプロイ先) 簡単なアプリケーションで、コンテナイメージの名称は sample/hello-world。デプロイ先は 開発環境と本番環境の2つ
- 履歴保存仕様 開発環境、本番環境それぞれ最新3つのバージョンのイメージは残しておく、それ以外のイメージは一定期間保存後削除しても構わない。
実現方法
不要イメージの自動削除には acr-cli というツールを使用します。このツールは指定されたリポジトリで一定期間経過したイメージの タグの削除と、タグなしマニフェストの削除を行います。
コマンド実行イメージは以下のようになります。
結果確認
事前状態
当初のACRリポジトリ内容(Azure Portalの表示内容)
az acr repository show-manifests --name ${ACR_NAME} --repository sample/hello-world -o yaml
実行結果
acr-cli コマンドのコンテナを作成
ACR上で acr-cli コマンドを実行するため、まずコンテナイメージを作成する必要があります。
手順
- acr-cli を取得します。
git clone https://github.com/Azure/acr-cli
- acr-cli ディレクトリ上で az acr buildを実行します。
az acr build -t acr:1.0.0 -r ${ACR_NAME} .
実行が完了するとイメージが作成されると思います。このイメージを以下のコマンド実行 az acr run
で使用します。
実行コマンド
まずDry Runモードでコマンドを実行してみましょう。
acr-cliのオプションは purge
で対象イメージの削除を実行、--ago
はその時間経過したら削除対象となります。ここでの指定は30分経過したらとしています。--ago 7d
と指定すると1週間経過したものを削除するといった内容になります。 --filter
で検索対象を指定します。 --keep
は保持するイメージの数、 --untagged
はイメージのタグがなくなった場合はManifestも削除するオプションになります(指定しない場合はタグのみ削除され、Manifestは残ります)。
(なお実行はすべてのイメージ作成後30分以上経過した時点で行っています。)
az acr run --cmd "${ACR_NAME}.azurecr.io/acr:1.0.0 purge --ago 30m --filter 'sample/hello-world:rel-.*' --keep 3 --untagged --dry-run " --registry ${ACR_NAME} /dev/null az acr run --cmd "${ACR_NAME}.azurecr.io/acr:1.0.0 purge --ago 30m --filter 'sample/hello-world:v.*' --keep 3 --dry-run " --registry ${ACR_NAME} /dev/null
1つ目のコマンド出力結果では
Deleting tags for repository: sample/hello-world ${ACR_NAME}.azurecr.io/sample/hello-world:rel-ce18 ${ACR_NAME}.azurecr.io/sample/hello-world:rel-cew ${ACR_NAME}.azurecr.io/sample/hello-world:rel-ceq ${ACR_NAME}.azurecr.io/sample/hello-world:rel-cep ${ACR_NAME}.azurecr.io/sample/hello-world:rel-cem ${ACR_NAME}.azurecr.io/sample/hello-world:rel-ce3 ${ACR_NAME}.azurecr.io/sample/hello-world:rel-ce2 Deleting manifests for repository: sample/hello-world ${ACR_NAME}.azurecr.io/sample/hello-world@sha256:7bc... ${ACR_NAME}.azurecr.io/sample/hello-world@sha256:bf4d... ${ACR_NAME}.azurecr.io/sample/hello-world@sha256:d792... ${ACR_NAME}.azurecr.io/sample/hello-world@sha256:f95... Number of deleted tags: 7 Number of deleted manifests: 4
といったメッセージが表示されると思います。これらが削除対象となるものです。
実行結果
コマンドそのものは期待通りの動作をしそうです。では次に実際に削除を実行してみましょう。
さきほどのコマンドから --dry-run
オプションを取り除いて実行します。
結果と「実現方法」で示した図と比較していただければ想定した動作になっていることがおわかりいただけると思います。
スケジュール実行
ここまでできればあとはスケジュール実行で登録するのみです。ACRではスケジュール実行機能(Cron)も提供されています。 こちらにタスクとして実行すれば自動的に世代管理が実現できると思います。
Microsoft docsの「消去のスケジュールを設定する」を参考に指定してみてください。
最後に
今回のACRイメージの世代管理を実現するためのポイントは実はイメージのタグ付けにあります。世代管理したい対象に対して(今回の例では開発環境用、本番環境用)それぞれ正規表現で検索できるように命名したタグをつけることで acr-cli を使い簡単に世代管理を実現できるようになります。
まだ acr-cli はPreview段階ではありますが、OSSとしてGitHubに公開されているものでもありますので、ぜひご活用いただきたいと思います。