如何从AWS ECR Container Registry中删除未标记的图像

And*_*ega 12 amazon-web-services docker amazon-ecr

将图像推送到Amazon ECR时,如果标记已存在于repo中,则旧图像仍保留在注册表中,但处于未标记状态.

因此,如果我image/haha:1.0.0第二次使用docker push 这样做(假设某些内容发生了变化),那么第一张图片就会被取消标记AWS ECR.

有没有办法从未标记的图像中安全地清理所有注册表?

nfv*_*fvs 21

您可以在单个请求中删除所有图像,而无需循环:

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
Run Code Online (Sandbox Code Playgroud)

首先,它以json格式获取未标记的图像列表:

[ {"imageDigest": "sha256:..."}, {"imageDigest": "sha256:..."}, ... ]

然后它将该列表发送给batch-image-delete.

|| true当没有未标记的图像时,最后一个是避免错误代码所必需的.

  • ECR 不支持超过 100 个图像。这修复了: ``` IMAGES_TO_DELETE=$( aws ecr list-images --region $ECR_REGION --repository-name $ECR_REPO --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --max-items 100 --输出 json ) aws ecr 批量删除图像 --region $ECR_REGION --repository-name $ECR_REPO --image-ids "$IMAGES_TO_DELETE" || 真``` (2认同)

And*_*ega 11

我实际上伪造了一个单行解决方案 aws cli

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
Run Code Online (Sandbox Code Playgroud)

它正在做的是:

  • 获取所有存储库
  • 为每个存储库提供所有图像 tagStatus=UNTAGGED
  • 每个图像+回购发行一个 batch-delete-image

  • 可能是 AWS CLI 输出发生了变化,但 `awk '{print $5}'` 提供了 ARN。应该是 `awk '{print $6}'` 来获取存储库名称。 (4认同)

Lor*_*odi 11

现在,该ECR支持生命周期策略(https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html),您可以使用它自动删除未标记的图像。

使用控制台设置生命周期策略预览

通过以下网址打开Amazon ECS控制台:https://console.aws.amazon.com/ecs/

从导航栏中,选择包含要在其上执行生命周期策略预览的存储库的区域。

在导航窗格中,选择“存储库”,然后选择一个存储库。

在“所有存储库:repository_name”页面上,选择“空运行生命周期规则”,然后单击“添加”。

输入您的生命周期策略规则的以下详细信息:

对于“规则优先级”,为规则优先级键入一个数字。

对于“规则描述”,键入生命周期策略规则的描述。

对于“图像状态”,选择“已标记”或“未标记”。

如果您为“图像状态”指定了“已标记”,然后为“标记前缀列表”指定了,则可以选择指定要对其生命周期策略执行操作的图像标记列表。如果指定“未标记”,则此字段必须为空。

对于“匹配条件”,为“计数类型”,“计数编号”和“计数单位”选择值(如果适用)。

选择保存

通过重复步骤5-7创建其他生命周期策略规则。

要运行生命周期策略预览,请选择“保存并预览结果”。

在“预览图像结果”下,查看生命周期策略预览的影响。

如果对预览结果感到满意,请选择“应用为生命周期策略”以使用指定规则创建生命周期策略。

从这里:https : //docs.aws.amazon.com/AmazonECR/latest/userguide/lpp_creation.html


Ken*_*n J 7

设置生命周期策略绝对是管理此问题的最佳方式。话虽如此 - 如果您确实有一堆要删除的图像,请记住,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
Run Code Online (Sandbox Code Playgroud)