ACR(Azure Container Registry)に保存されているイメージの世代管理をしたい

ACRのイメージが溜まるのが気になるので、古いモノ削除したいなと思って調べてみたら以下のMicrosoftの公式ページにまとまっていました。

ただ、記載があるのは、タイムスタンプである期間より古いものとか、タグの付いてないものを削除する手順でした。今回は 「最新10世代を残す」 みたいな世代管理をしたかったので、自分でコマンド組みました。

docs.microsoft.com

docs.microsoft.com

Shellで実行

シェルから叩くなら以下のように叩くと設定した最新の世代数を残してイメージを削除できます。

JMESPathのSliceを使うと上手くできました。

https://jmespath.org/specification.html#slices

REGISTRY=YOUR_REGISTORY
REPOSITORY=YOUR_REPOSITORY
# ↓これが世代数
RETENTION_NUM=10
QUERY="[].[digest][${RETENTION_NUM}:]"

az acr repository show-manifests --name ${REGISTRY} --repository ${REPOSITORY} --orderby time_desc -o tsv --query ${QUERY} | \
  xargs -I% az acr repository delete --name ${REGISTRY} --image ${REPOSITORY}@% --yes

DevOps Pipelineに組み込み

CronJobなどで動かしても良いと思いますが、同じものをDevOpsのPipelineに組み込んでも使い勝手良いかもです。

- task: Bash@3
  displayName: Housekeeping Images of ACR
  inputs:
    targetType: "inline"
    script: |
      RETENTION_NUM=10
      QUERY="[].[digest][${RETENTION_NUM}:]"
      az acr repository show-manifests --name $(containerRegistry) --repository $(repositoryName) --orderby time_desc -o tsv --query ${QUERY} | \
        xargs -I% az acr repository delete --name $(containerRegistry) --image $(repositoryName)@% --yes