Amazon ECRにイメージをプッシュするときに、タグがリポジトリ内にすでに存在する場合、古いイメージはレジストリ内に残りますが、タグなしの状態になります。
だから私がドッカーならimage/haha:1.0.0
2回目にこれを実行すると(何かが変更された場合)、最初の画像のタグが解除されますAWS ECR
。
タグなしの画像からすべてのレジストリを安全にクリーンアップする方法はありますか?
私は実際にaws cli
を使用して1行のソリューションを偽造しました
aws ecr describe-repositories --output text | awk '{print $5}' | while read line; do aws ecr list-images --repository-name $line --filter tagStatus=UNTAGGED --query 'imageIds[*]' --output text | while read imageId; do aws ecr batch-delete-image --repository-name $line --image-ids imageDigest=$imageId; done; done
それがしていることは:
tagStatus=UNTAGGED
batch-delete-image
を発行しますループなしで、1回のリクエストですべての画像を削除できます。
IMAGES_TO_DELETE=$( aws ecr list-images --region $ECR_REGION --repository-name $ECR_REPO --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json )
aws ecr batch-delete-image --region $ECR_REGION --repository-name $ECR_REPO --image-ids "$IMAGES_TO_DELETE" || true
まず、タグ付けされていない画像のリストをjson形式で取得します。
[ {"imageDigest": "sha256:..."}, {"imageDigest": "sha256:..."}, ... ]
次に、そのリストをbatch-image-delete
に送信します。
タグの付いていない画像がない場合のエラーコードを回避するには、最後の|| true
が必要です。
ECRはライフサイクルポリシーをサポートするようになりました( https://docs.aws.Amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html )。これを使用して、タグ付けされていない画像を自動的に削除できます。
コンソールを使用してライフサイクルポリシープレビューを設定する
https://console.aws.Amazon.com/ecs/ でAmazon ECSコンソールを開きます。
ナビゲーションバーから、ライフサイクルポリシーのプレビューを実行するリポジトリを含むリージョンを選択します。
ナビゲーションペインで、[リポジトリ]を選択し、リポジトリを選択します。
[すべてのリポジトリ:repository_name]ページで、ドライランライフサイクルルール、追加を選択します。
ライフサイクルポリシールールの次の詳細を入力します。
[ルールの優先度]に、ルールの優先度の数値を入力します。
「ルールの説明」に、ライフサイクルポリシールールの説明を入力します。
[画像ステータス]で、[タグ付き]または[タグなし]を選択します。
イメージステータスにタグ付きを指定した場合は、タグプレフィックスリストで、オプションでライフサイクルポリシーでアクションを実行するイメージタグのリストを指定できます。タグなしを指定した場合、このフィールドは空でなければなりません。
一致基準について、カウントタイプ、カウント数、およびカウントユニット(該当する場合)の値を選択します。
保存を選択します
手順5〜7を繰り返して、追加のライフサイクルポリシールールを作成します。
ライフサイクルポリシーのプレビューを実行するには、[結果を保存してプレビュー]を選択します。
[イメージ結果のプレビュー]で、ライフサイクルポリシープレビューの影響を確認します。
プレビュー結果に満足している場合は、[ライフサイクルポリシーとして適用]を選択して、指定したルールでライフサイクルポリシーを作成します。
ここから: https://docs.aws.Amazon.com/AmazonECR/latest/userguide/lpp_creation.html
ライフサイクルポリシーを設定することは、間違いなくこれを管理する最良の方法です。つまり、削除したい画像がたくさんある場合は、batch-delete-imagesの最大値が100であることを覚えておいてください。これは、タグの付いていない画像の数が100を超えるためです。
IMAGES_TO_DELETE=$( aws ecr list-images --repository-name $ECR_REPO --filter "tagStatus=UNTAGGED" --query 'imageIds[0:100]' --output json )
echo $IMAGES_TO_DELETE | jq length # Gets the number of results
aws ecr batch-delete-image --repository-name $ECR_REPO --image-ids "$IMAGES_TO_DELETE" --profile qa || true