Azure Container Registry からイメージを自動的に消去する

開発ワークフローの一部として Azure Container Registry を使用すると、レジストリは短時間で不要なイメージやその他の成果物によりすぐにいっぱいになる可能性があります。 特定の期間よりも前のタグをすべて削除することも、指定した名前フィルターに一致したタグをすべて削除することもできます。 複数の成果物をすばやく削除できるように、この記事では、オンデマンドまたはスケジュールされた ACR タスクとして実行できる acr purge コマンドを紹介します。

acr purge コマンドは現在、GitHub の acr-cli リポジトリのソース コードから作成された、パブリック コンテナー イメージ (mcr.microsoft.com/acr/acr-cli:0.5) で配布されています。 acr purge は現在プレビューの段階です。

Azure Cloud Shell または Azure CLI のローカル インストールを使用して、この記事の ACR タスクの例を実行できます。 これをローカルで使用したい場合は、バージョン 2.0.76 以降が必要です。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

警告

acr purge コマンドを使用する際は注意してください。削除されたイメージ データは回復することができません。 (イメージ名ではなく) マニフェスト ダイジェストによってイメージをプルするシステムを使用している場合は、タグなしのイメージを消去しないでください。 このようなシステムでは、タグの付いていないイメージを削除すると、レジストリからイメージをプルできなくなります。 マニフェストでプルするのではなく、一意のタグ付けスキームの推奨されるベスト プラクティスを採用することを検討してください。

Azure CLI コマンドを使用して 1 つのイメージ タグまたはマニフェストを削除する場合は、「Azure Container Registry のコンテナー イメージを削除する」を参照してください。

消去コマンドを使用する

acr purge コンテナー コマンドでは、名前フィルターに一致するイメージおよび指定した期間よりも古いイメージがリポジトリ内のタグによって削除されます。 既定では、タグ参照のみが削除され、基になるマニフェストおよびレイヤー データは削除されません。 このコマンドには、マニフェストも削除するオプションがあります。

Note

acr purge では、write-enabled 属性が false に設定されているイメージ タグまたはリポジトリは削除されません。 詳細については、「Azure Container Registry でのコンテナー イメージをロックする」を参照してください。

acr purge は、ACR タスクでコンテナー コマンドとして実行するように設計されているため、そのタスクを実行するレジストリで自動的に認証され、そこでアクションを実行します。 この記事のタスク例では、完全修飾コンテナー イメージ コマンドの代わりに、acr purge コマンドのエイリアスを使用します。

重要

  • acr purge を実行する標準コマンドは az acr run --registry <YOUR_REGISTRY> --cmd 'acr purge --optional parameter' /dev/null です。
  • ACR 消去を使用するには、完全な acr purge コマンドを実行することをお勧めします。 たとえば、acr purge --helpaz acr run --registry <YOUR_REGISTRY> --cmd 'acr purge --help' /dev/null として実行します。

acr purge を実行するときは、少なくとも以下を指定します。

  • --filter - レジストリ内のイメージをフィルター処理するためのリポジトリ名 "正規表現" とタグ名 "正規表現"。 例: --filter "hello-world:.*" では hello-world リポジトリ内のすべてのタグとマッチし、--filter "hello-world:^1.*" では hello-world リポジトリ内で 1 で始まるタグとマッチし、--filter ".*/cache:.*" ではリポジトリ内の /cache で終わるすべてのタグとマッチします。 また、複数の --filter パラメーターを渡すこともできます。
  • --ago - イメージが削除されるまでの期間を示す Go スタイルの期間文字列。 この期間は、1 つまたは複数の一連の 10 進数で構成され、それぞれに単位サフィックスが付きます。 有効な時間単位には、日を表す "d"、時間を表す "h"、分を表す "m" などがあります。 たとえば、--ago 2d3h6m の場合は、最後に変更されたのが 2 日と 3 時間 6 分以上前であるフィルター処理されたイメージがすべて選択され、--ago 1.5h の場合は、最後に変更されたのが 1.5 時間以上前であるイメージが選択されます。

acr purge では、いくつかのオプション パラメーターがサポートされます。 この記事の例では、次の 2 つを使用します。

  • --untagged - タグが関連付けられていないマニフェスト ("タグなしマニフェスト") を削除することを指定します。 このパラメーターを使用すると、既に削除されているタグに加え、タグなしマニフェストも削除されます。
  • --dry-run - データは削除しないが、出力をこのフラグなしでコマンドを実行した場合と同じにすることを指定します。 このパラメーターは、削除コマンドをテストして、保存しようとしているデータが誤って削除されることがないことを確認する場合に役立ちます。
  • --keep - 削除するタグの最新の x 個を保持するように指定します。
  • --concurrency - 同時に処理する消去タスクの数を指定します。 このパラメーターが指定されていない場合は、既定値が使用されます。

Note

--untagged フィルターは --ago フィルターに応答しません。 その他のパラメーターについては、acr purge --help を実行してください。

acr purge では、Run 変数や、ストリーミングされ、後で取得できるように保存されるタスク実行ログなど、ACR タスク コマンドの他の機能もサポートしています。

オンデマンド タスクで実行する

次の例では、az acr run コマンドを使用して、acr purge コマンドをオンデマンドで実行します。 この例では、myregistry 内の hello-world リポジトリにある、1 日以上前に変更されたすべてのイメージ タグとマニフェストに加え、タグなしマニフェストを削除します。 コンテナー コマンドは、環境変数を使用して渡されます。 タスクは、ソース コードのコンテキストなしで実行されます。

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --untagged --ago 1d"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  /dev/null

スケジュールされたタスクで実行する

次の例では、az acr task create コマンドを使用して、毎日スケジュールされた ACR タスクを作成します。 このタスクでは、hello-world リポジトリ内で 7 日以上前に変更されたタグが消去されます。 コンテナー コマンドは、環境変数を使用して渡されます。 タスクは、ソース コードのコンテキストなしで実行されます。

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --ago 7d"

az acr task create --name purgeTask \
  --cmd "$PURGE_CMD" \
  --schedule "0 0 * * *" \
  --registry myregistry \
  --context /dev/null

タイマー トリガーが構成されていることを確認するには、az acr task show コマンドを実行します。

多数のタグとマニフェストを消去する

多数のタグとマニフェストを削除する場合は、数分またはそれ以上かかることがあります。 何千ものタグとマニフェストを削除する場合は、コマンドの実行時間が、オンデマンド タスクの既定のタイムアウト時間 (600 秒)、またはスケジュールされたタスクの既定のタイムアウト時間 (3600 秒) より長くなることがあります。 タイムアウト時間が経過すると、タグとマニフェストのサブセットのみが削除されます。 大規模な消去を確実に完了するには、--timeout パラメーターを渡して値を増やします。

たとえば、次のオンデマンド タスクでは、タイムアウト時間を 3600 秒 (1 時間) に設定されます。

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --ago 1d --untagged"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  --timeout 3600 \
  /dev/null

例:レジストリ内にある複数のリポジトリのスケジュールされた消去

この例では、acr purge を使用して、レジストリ内の複数のリポジトリを定期的にクリーン アップします。 たとえば、samples/devimage1 リポジトリと samples/devimage2 リポジトリにイメージをプッシュする開発パイプラインがあるとします。 デプロイ用の運用リポジトリに開発イメージを定期的にインポートするため、開発イメージは不要になりました。 毎週、samples/devimage1 リポジトリと samples/devimage2 リポジトリは、次の週の作業に備えて消去します。

消去のプレビュー

データを削除する前に、--dry-run パラメーターを使用して、オンデマンドの消去タスクを実行することをお勧めします。 このオプションを使用すると、データを削除することなく、コマンドによって消去されるタグとマニフェストを表示できます。

次の例では、各リポジトリのフィルターによってすべてのタグが選択されます。 --ago 0d パラメーターは、フィルターと一致するリポジトリにあるすべての経過時間のイメージに一致します。 必要に応じて、ご自身のシナリオの選択条件を変更します。 --untagged パラメーターでは、タグに加えてマニフェストを削除することが指定されます。 コンテナー コマンドは、環境変数を使用して az acr run コマンドに渡されます。

# Environment variable for container command line
PURGE_CMD="acr purge \
  --filter 'samples/devimage1:.*' --filter 'samples/devimage2:.*' \
  --ago 0d --untagged --dry-run"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  /dev/null

コマンドの出力を確認すると、選択パラメーターに一致するタグとマニフェストがわかります。 コマンドは --dry-run を使用して実行されるため、データは削除されません。

サンプル出力:

[...]
Deleting tags for repository: samples/devimage1
myregistry.azurecr.io/samples/devimage1:232889b
myregistry.azurecr.io/samples/devimage1:a21776a
Deleting manifests for repository: samples/devimage1
myregistry.azurecr.io/samples/devimage1@sha256:81b6f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e788b
myregistry.azurecr.io/samples/devimage1@sha256:3ded859790e68bd02791a972ab0bae727231dc8746f233a7949e40f8ea90c8b3
Deleting tags for repository: samples/devimage2
myregistry.azurecr.io/samples/devimage2:5e788ba
myregistry.azurecr.io/samples/devimage2:f336b7c
Deleting manifests for repository: samples/devimage2
myregistry.azurecr.io/samples/devimage2@sha256:8d2527cde610e1715ad095cb12bc7ed169b60c495e5428eefdf336b7cb7c0371
myregistry.azurecr.io/samples/devimage2@sha256:ca86b078f89607bc03ded859790e68bd02791a972ab0bae727231dc8746f233a

Number of deleted tags: 4
Number of deleted manifests: 4
[...]

消去のスケジュールを設定する

ドライ ランの確認が完了したら、スケジュールされたタスクを作成して消去を自動化します。 次の例では、毎週のタスクを日曜日の 1:00 UTC にスケジュールして、前の消去コマンドを実行します。

# Environment variable for container command line
PURGE_CMD="acr purge \
  --filter 'samples/devimage1:.*' --filter 'samples/devimage2:.*' \
  --ago 0d --untagged"

az acr task create --name weeklyPurgeTask \
  --cmd "$PURGE_CMD" \
  --schedule "0 1 * * Sun" \
  --registry myregistry \
  --context /dev/null

タイマー トリガーが構成されていることを確認するには、az acr task show コマンドを実行します。

次のステップ

Azure Container Registry でイメージ データを削除するその他のオプションについて説明します。

イメージの保存の詳細については、「Azure Container Registry へのコンテナー イメージの保存」を参照してください。