APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

ACRイメージの世代管理を実現する

f:id:turtle2005:20220408155804p:plain
Azure Container Registry

はじめに

開発したアプリケーションのコンテナイメージAzure Container Registryにしている方は多いと思います。何も管理しないでいるとどんどんコンテナイメージが増えるばかり。直近のイメージは保存しておきたいけど、不要になったイメージは削除してACRの容量を減らすことはできないだろうか。そんなことを考える方は多いと思います。

プレビュー段階ではありますが、それを実現するコマンドがMicrosoftから提供されています。

docs.microsoft.com

今回は実際にこちらを利用してみたいと思います。

やり方

要求仕様確認

今回実験するイメージは以下のような環境をイメージしました。

  • イメージ利用先(デプロイ先) 簡単なアプリケーションで、コンテナイメージの名称は sample/hello-world。デプロイ先は 開発環境と本番環境の2つ
  • 履歴保存仕様 開発環境、本番環境それぞれ最新3つのバージョンのイメージは残しておく、それ以外のイメージは一定期間保存後削除しても構わない。

実現方法

不要イメージの自動削除には acr-cli というツールを使用します。このツールは指定されたリポジトリで一定期間経過したイメージの タグの削除と、タグなしマニフェストの削除を行います。

コマンド実行イメージは以下のようになります。

f:id:turtle2005:20220408181153p:plain

結果確認

事前状態

当初のACRリポジトリ内容(Azure Portalの表示内容) f:id:turtle2005:20220408180205p:plain

az acr repository show-manifests --name ${ACR_NAME} --repository sample/hello-world -o yaml 実行結果

acr-cli コマンドのコンテナを作成

ACR上で acr-cli コマンドを実行するため、まずコンテナイメージを作成する必要があります。

手順

  1. acr-cli を取得します。 git clone https://github.com/Azure/acr-cli
  2. 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 オプションを取り除いて実行します。

f:id:turtle2005:20220408185559p:plain

結果と「実現方法」で示した図と比較していただければ想定した動作になっていることがおわかりいただけると思います。

スケジュール実行

ここまでできればあとはスケジュール実行で登録するのみです。ACRではスケジュール実行機能(Cron)も提供されています。 こちらにタスクとして実行すれば自動的に世代管理が実現できると思います。

Microsoft docsの「消去のスケジュールを設定する」を参考に指定してみてください。

最後に

今回のACRイメージの世代管理を実現するためのポイントは実はイメージのタグ付けにあります。世代管理したい対象に対して(今回の例では開発環境用、本番環境用)それぞれ正規表現で検索できるように命名したタグをつけることで acr-cli を使い簡単に世代管理を実現できるようになります。

まだ acr-cli はPreview段階ではありますが、OSSとしてGitHubに公開されているものでもありますので、ぜひご活用いただきたいと思います。