AWS
Docker
ECR

ECRにpushしたイメージをワンライナーで古いものから削除する

More than 1 year has passed since last update.

ECRにライフサイクルポリシーの機能が追加されたので自分で消す必要がなくなりました!

ルールを設定すればルールに応じて自動で削除されます。詳細は下記を確認して下さい。

https://aws.amazon.com/jp/blogs/news/clean-up-your-container-images-with-amazon-ecr-lifecycle-policies/

==============以下、ライフサイクルポリシーの機能がなかったときの話==============

ECRのレポジトリ毎のイメージ数の最大は初期値で1000です(申請すれば上限は上げられます)。

上限を超えたとき自動では削除してくれないので定期的に削除する必要があります。

tagに時系列の判断できるものを付けていれば簡単に削除できますが、gitのcommitidなどを付けているとそれだけでは時系列が分からないので削除が面倒になります。

そういった場合でもECRはpushされた時間をimagePushedAtとして保持しているのでその値を参照すれば時系列的に古いイメージを判別することが出来ます。

(あくまでもpushされた時間なのでイメージそのものが古いかどうかは判別できません。)

imagePushedAtを使って古いイメージを削除するワンライナーは下記の通りです。


aws ecr describe-images --repository-name <レポジトリ名> --query 'imageDetails[]' | jq 'sort_by(.imagePushedAt) | .[].imageTags[]' -r | head -n <削除件数> | xargs -I{} aws ecr batch-delete-image --repository-name <レポジトリ名> --image-ids imageTag={}

<レポジトリ名><削除件数>を指定の値に置き換えて実行すれば、古いものから指定件数分削除されます。