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 --help
をaz 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
- タグが関連付けられていないマニフェスト ("タグなしマニフェスト") を削除することを指定します。 このパラメーターを使用すると、既に削除されているタグに加え、タグなしマニフェストも削除されます。 マニフェストに関連付けられているすべてのタグを削除して消去します。その場合にのみ、--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 へのコンテナー イメージの保存」を参照してください。