ACRのイメージが溜まるのが気になるので、古いモノ削除したいなと思って調べてみたら以下のMicrosoftの公式ページにまとまっていました。
ただ、記載があるのは、タイムスタンプである期間より古いものとか、タグの付いてないものを削除する手順でした。今回は 「最新10世代を残す」
みたいな世代管理をしたかったので、自分でコマンド組みました。
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