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

时间:2016-12-03 15:24:47

标签: amazon-web-services docker amazon-ecr

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

因此,如果我第二次按image/haha:1.0.0推送AWS ECR(假设某些内容发生变化),则第一张图片会从import numpy as np L = [[1,2,3],[4,3,6]] # 3 occurs twice output = np.transpose(np.where(np.array(L) == 3)) print(output) 取消标记。

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

6 个答案:

答案 0 :(得分:17)

您可以在一个请求中删除所有图像,不带循环:

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来避免错误代码。

答案 1 :(得分:7)

我实际上使用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

它正在做的是:

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

答案 2 :(得分:3)

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

  

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

     

https://console.aws.amazon.com/ecs/打开Amazon ECS控制台。

     

从导航栏中,选择包含该区域的区域   用于执行生命周期策略预览的存储库。

     

在导航窗格中,选择存储库并选择存储库。

     

在All repositories:repository_name页面上,选择Dry-Run   生命周期规则,添加。

     

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

     

对于规则优先级,请键入规则优先级的编号。

     

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

     

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

     

如果为图像状态指定了标记,则对于标记前缀列表,   您可以选择指定要拍摄的图像标签列表   与您的生命周期政策一起行动。如果你指定了Untagged,这个   字段必须为空。

     

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

     

选择保存

     

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

     

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

     

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

     

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

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

答案 3 :(得分:1)

Setting a Lifecycle policy is definitely the best way of managing this. That being said - if you do have a bunch of images that you want to delete keep in mind that the max for batch-delete-images is 100. So you need to do this is for the number of untagged images is greater than 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

答案 4 :(得分:0)

基于@Ken J 的回答,

这是一个可以清理所有 ECR 的 Python 脚本:

#!/usr/bin/python3
import subprocess
import json
import os
# Based on: https://stackoverflow.com/questions/40949342/how-to-delete-untagged-images-from-aws-ecr-container-registry
region="us-east-1"

debug = False

def _runCommand(command):
    if debug:
        print(" ".join(command))
    p = subprocess.Popen(command, shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    return [p.stdout.read().decode("utf-8"), p.stderr.read().decode("utf-8")]

command = "aws ecr describe-repositories --region " + region + " --output json".split(" ")
data = _runCommand(command)[0]

for i in json.loads(data)["repositories"]:
     name = i["repositoryName"]
     print(name)
     command = ["aws", "ecr", "list-images", "--region", region, "--repository-name", name, "--filter", "tagStatus=UNTAGGED", "--query", 'imageIds[*]', "--output" , "json"]
     data = _runCommand(command)[0]
     
     command = ["aws", "ecr", "batch-delete-image", "--region", region, "--repository-name", name, "--image-ids",data]
     data = _runCommand(command)[0]
     print(data)

答案 5 :(得分:0)

如果您想从存储库中删除未标记的图像,您只需创建一个 JSON 生命周期策略,然后使用 python 将 JSON 策略应用于存储库

就我而言,我正在将策略应用于 ECR 中的所有 ECR 存储库,并且我在当前目录中创建了一个“lifecyclepolicy.json”文件,我在其中添加了 ECR 的生命周期策略

这是我的python代码:-

    import os
    import json
    import boto3
 
    def ecr_lifecycle(lifecycle_policy):
        ecr_client = boto3.client('ecr')

        repositories = []
        describe_repo_paginator = ecr_client.get_paginator('describe_repositories')
        for response_list_repopaginator in describe_repo_paginator.paginate():
            for repo in response_list_repopaginator['repositories']:
                repositories.append(repo['repositoryName'])
        for repository in repositories:
            response=ecr_client.put_lifecycle_policy(repositoryName=repository,
            lifecyclePolicyText=json.dumps(lifecycle_policy))
        return response


    if __name__ == '__main__':
        path = os.path.dirname(__file__) 
        json_file = open(os.path.join(path, 'lifecyclepolicy.json'))
        data = json.load(json_file)
        ecr_lifecycle(data)

如果您想查看 JSON 文件:-

{

"rules": [
    {
      {
        "rulePriority": 10,
        "description": "Only keep untagged images for 7 days",
        "selection": {
            "tagStatus": "untagged",
            "countType": "sinceImagePushed",
            "countUnit": "days",
            "countNumber": 7
        }
        "action": {
            "type": "expire"
        }
    }
  ]
}