Azure コンテナー レジストリからイメージを自動的に消去する (プレビュー)

Azure コンテナー レジストリを開発ワークフローの一部として使用すると、レジストリは、短期間後に不要なイメージやその他の成果物ですぐにいっぱいになる可能性があります。 特定の期間よりも前のタグをすべて削除することも、指定した名前フィルターに一致したタグをすべて削除することもできます。

複数の成果物をすばやく削除するには、 acr purge コマンドを使用します。 acr purgeは、オンデマンドまたはスケジュールされた ACR タスクとして実行できます。

重要

acr purge は現在プレビュー段階です。 ベータ版、プレビュー版、または他の方法で一般公開されていない Azure の機能に適用される法的条件については、Microsoft Azure プレビューの追加利用規約を参照してください。

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

この記事の ACR タスクの例を実行するには、Azure CLIのAzure Cloud Shellまたはローカル インストールを使用します。 インストールまたはアップグレードするには、「Install Azure CLIを参照してください。

警告

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

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

消去コマンドを使用する

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

注意

既定では、write-enabledまたはdelete-enabled属性が false に設定されている場合、acr purgeはイメージ タグまたはマニフェストを削除しません。 これらのロックされた成果物も消去するには、 --include-locked パラメーターを使用します。これにより、一致する各タグまたはマニフェストのロックが解除されてから削除されます。 詳細については、「 Azure コンテナー レジストリにコンテナー イメージをロックするを参照してください。

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

重要

acr purge コマンドを実行する標準コマンドがaz acr run --registry <YOUR_REGISTRY> --cmd 'acr purge --optional parameter' /dev/null

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

acr purge では、いくつかの省略可能なパラメーターがサポートされています。

  • --untagged - タグが関連付けられていないすべてのマニフェスト (タグなしマニフェスト) を削除します。 このパラメーターは、コマンドによって既に削除されているタグに加えて、タグ付けされていないマニフェストを削除します。 マニフェストに関連付けられているすべてのタグを削除して消去します。タグのないマニフェストは、 --untaggedを使用して消去できます。

注意

タグなしパラメーターは、mcr.microsoft.com/acr/acr-cli:0.17 で始まる --ago 期間フィルターを受け入れます。

  • --dry-run - データが削除されていないことを指定しますが、コマンドはこのフラグなしでコマンドを実行した場合と同じ出力を生成します。 このパラメーターは、消去コマンドをテストして、保持する予定のデータが誤って削除されないようにするのに役立ちます。
  • --keep - リポジトリごとに保持される、削除対象のタグまたはマニフェストの最新の数を指定します。 保持カウントは、 --untagged または --untagged-onlyを指定した場合にのみマニフェストに適用され、タグとマニフェストに個別に適用されます。 最新のタグとマニフェストは、指定された --filter オプションと一致する各リポジトリの最終変更時刻によって決まります。
  • --concurrency - 同時に処理する消去タスクの数を指定します。
  • --untagged-only - 最初にタグを削除することなく、タグのないマニフェスト(タグが付いていないダングリング マニフェスト)のみを削除します。 acr purge--filterを必要とする標準の--ago フローとは異なり、このフラグを指定すると、これらのパラメーターは省略可能になります。 --filterしないと、すべてのリポジトリがスキャンされます。 それを --ago と組み合わせて、年齢と --keep でフィルター処理して、最近タグ付けされていないマニフェストの数を保持できます。
  • --include-locked - タグとマニフェストがロックされている場合でも消去します (つまり、 write-enabled 属性または delete-enabled 属性は false に設定されます)。 一致するロックされた成果物ごとに、 acr purge 最初に両方の属性を true に戻してロックを解除してから、削除します。 このフラグがないと、ロックされたタグとマニフェストはスキップされます。 このパラメーターは、 mcr.microsoft.com/acr/acr-cli:0.17 以降で使用できます。 ロックの詳細については、「Azure コンテナー レジストリでコンテナー イメージをロックする」を参照してください。

Caution

--include-locked は、ロックによって提供される削除保護を無効にし、--filter--ago の選択に一致するすべてのアーティファクトに適用されます。 削除されたデータは 回復できません。 最初に --dry-run で実行して、削除される内容を確認します。

その他のパラメーターについては、 acr purge --helpを実行してください。

acr purge では、ACR タスク コマンドの他の機能がサポートされています。これには、後で取得するためにストリーミングおよび保存される実行 変数タスク実行ログ が含まれます。

オンデマンド タスクで消去コマンドを実行する

次の例では、az acr run コマンドを使用して、acr purge コマンドをオンデマンドで実行します。 この例では、1 日以上前に変更された myregistry の hello-world リポジトリ内のすべてのイメージ タグと関連するマニフェストを削除します。 また、タグ付けされていないマニフェストも削除されます。これにより、タグ付けされたイメージと同じ --ago 期間フィルターが適用されるようになりました。 コンテナー コマンドは環境変数を使用して渡され、タスクはソース コンテキストなしで実行されます。

# 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 秒、スケジュールされたタスクの場合は 3,600 秒よりも長く実行する必要がある場合があります。 コマンドがタイムアウトすると、プロセスはタグとマニフェストのサブセットのみを削除します。 大規模な消去を確実に完了するには、--timeout パラメーターを渡して値を増やします。

たとえば、次のオンデマンド タスクでは、タイムアウト時間が 3,600 秒 (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 コマンドを実行します。

例: タグ付けされていないマニフェストのみを消去する

タグ付けされた画像に触れることなく、タグ付けされていないマニフェストのみを削除したい場合があります。 これを実現するには、^$ などのタグ名に一致しないリポジトリ フィルターを使用します。 これにより、acr purge はすべてのタグをスキップし、タグ付けされていないマニフェストのみを評価します。

# 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

例: タグ付けされていないマニフェストのみを消去する --untagged-only

--untagged-only フラグを使用すると、タグを削除せずに未解決のマニフェストを簡単にクリーンアップできます。 タグの削除に--untaggedタグ付けされていないマニフェストを削除するとは異なり、--untagged-onlyはタグの削除を完全にスキップします。

レジストリ内のすべてのリポジトリでタグ付けされていないマニフェストをすべて消去するには:

PURGE_CMD="acr purge --untagged-only"

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

ABAC 対応レジストリでの消去

Attribute-Based Access Control (ABAC) が有効になっているレジストリでは、レジストリ全体のロールではなく、リポジトリ スコープのアクセス許可が使用されます。 acr purge コマンドは、ABAC 対応レジストリを自動的に検出し、その認証を調整します。追加のフラグは必要ありません。

ABAC レジストリはワイルドカード トークン スコープをサポートしていないため、 acr purge はリポジトリを バッチ で処理します (既定値: 10)。 バッチごとに、それらのリポジトリのみにスコープが設定された新しいアクセス トークンが要求されます。

必要なアクセス許可

許可 Role Scope
リポジトリの一覧を表示する Container Registry Repository Catalog Lister レジストリ
タグとマニフェストの読み取り、削除、管理 Container Registry Repository Contributor リポジトリごと

注意

ABAC 条件を使用して、 Container Registry Repository Contributor ロールのスコープを特定のリポジトリに設定できます。たとえば、削除アクセス権を samples/* のみに付与する場合などです。

リストのアクセス許可なしでの削除

ID に Container Registry Repository Catalog Lister アクセス許可がない場合でも、 --filter オプションで直接指定することで、1 つのリポジトリ内のタグとマニフェストを消去できます。 リポジトリ名は明示的であるため、 acr purge はリポジトリを一覧表示する必要はありません。 例えば次が挙げられます。

PURGE_CMD="acr purge --filter 'hello-world:.+' \
  --ago 1d"

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

この場合は、ターゲット リポジトリの Container Registry Repository Contributor ロール (または同等の読み取り/削除アクセス許可) のみが必要です。

部分アクセスの挙動

あなたの ID では完全削除できないリポジトリに --filter が一致する場合、コマンドは最初のアクセス許可のないリポジトリで停止し、完了したリポジトリ、失敗したリポジトリ、まだ処理されていないリポジトリを示します。

Tip

ID がアクセスできるリポジトリのみを対象とする特定の --filter を使用します。 たとえば、--filter 'samples/.*:.*'の代わりに --filter '.*:.*' を使用します。

次のステップ

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

イメージ ストレージの詳細については、「Container image storage in Azure Container Registry」を参照してください。