【问题标题】:How do I filter for ECR images created in the past week如何过滤过去一周创建的 ECR 图像
【发布时间】:2023-02-21 21:43:46
【问题描述】:

我正在使用 boto3 api,但如果它提供更多灵活性,我愿意使用 CLI。

client = boto3.session.Session(profile_name="prod").client("ecr", region_name="us-east-1")
response = client.describe_images(repositoryName=repository_name)

我以前做的是在上面做,只是使用sorted(response["imageDetails"], key=lambda x: x["imagePushedAt"])过滤日期。但是,我只收到 90 条回复,想知道​​这是否是内部限制。

我看到 describe_images 有一个 filter 参数,我尝试通过执行以下操作来做到这一点,但出现错误:*** botocore.exceptions.ParamValidationError: Parameter validation failed: Unknown parameter in filter: "Name", must be one of: tagStatus Unknown parameter in filter: "Values", must be one of: tagStatus

import datetime

date_filter = (datetime.datetime.now() - datetime.timedelta(days=7)).strftime("%Y-%m-%d")
filter={"Name": "imagePushedAt", "Values": [date_filter+"*"]}
response = client.describe_images(repositoryName=repository_name, filter=filter)

关于如何过滤 ECR 图像的任何想法?

【问题讨论】:

    标签: amazon-web-services boto3


    【解决方案1】:

    当您查看 (ecr.describe_images)[https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ecr.html#ECR.Client.describe_images] 的 BOTO3 文档时,您会看到一些东西:

    • 一个可选的nextToken参数
    • 一个可选的maxResults参数

    nextToken 用于迭代并获得额外批次的结果。默认情况下,该函数限制为每批 100 个结果,但如果需要,您可以将其增加到 1000 个。如果(或何时)您的存储库中有超过 1000 张图像,您将无法避免使用分页支持,唉。

    如果您愿意,可以使用 client.get_paginator() 方法。不过,在下面,我是在您已经开始的基础上构建的。

    您会在文档中注意到的另一件事是 filter 参数,正如您注意到的那样,它确实相当有限。

    你提到找到 90 张图像,这表明你在前 100 张图像中有 10 张上周之前的图像。

    这是单程遍历所有图像,并检查每个图像的imagePushedAt

    #!/usr/bin/env python3
    
    import boto3
    import datetime
    
    my_profile = "prod"
    my_region  = "us-east-1"
    my_repo    = <repository_name>
    
    date_threshold = (datetime.datetime.now() - datetime.timedelta(days=7)).strftime("%Y-%m-%d")
    print("date threshold = {}".format(date_threshold))
    
    batch = 0
    image = 0
    total = 0
    client = boto3.session.Session(profile_name=my_profile).client("ecr", region_name=my_region)
    nextToken = {}
    while True:
        response = client.describe_images(repositoryName=my_repo, **nextToken)
        batch = batch + 1
        print("Batch {}:".format(batch))
        for entry in response["imageDetails"]:
            total = total + 1
            if entry["imagePushedAt"].strftime("%Y-%m-%d") >= date_threshold:
                image = image + 1
                print("  Image #{}/{}: {} pushed at {}".format(image, total, entry["imageDigest"], entry["imagePushedAt"]))
        if "nextToken" in response:
            nextToken = { "nextToken": response["nextToken"] }
        else:
            break
    
    print("Done - {} batch(es), {} images match out of {}".format(batch, image, total))
    

    如果您想一次批量处理超过默认的 100 个,您可以在 describe_images() 调用中添加 maxResults 参数。

    希望有帮助!

    【讨论】:

    • 我对 SO 比较陌生,不太确定它说您“正在从信誉良好的来源寻找答案”是什么意思。所有的赏金都这么说吗?无论如何,我从事编程已有 30 多年,并且在 AWS 中运行一个重要的生产环境已有数年之久,其中包含许多(更长/更短)Python/boto3 脚本。
    • 嘿,早就应该感谢你了,但我终于开始使用它并拯救了我的皮肤。谢谢。你真棒!不用担心信誉良好的来源,您就是信誉良好的来源。
    【解决方案2】:

    我的 Python 很生疏,但我最近也有同样的要求。稍微依靠 ChatGPT 开始(因此混合了蛇案例)。我希望根据日期将最后 x 个 ECR 图像上传到存储库。 Boto3 在这里似乎有点差距(或者至少我可以轻松地将这样的过滤器指定为输入并不明显)。

    def getLastEcrImages(ecrCli, repoName, numToFetch):
        response = ecrCli.describe_images(repositoryName=repoName)
        image_details = response['imageDetails']
        sorted_images = sorted(image_details, key=lambda k: k['imagePushedAt'], reverse=True)[:numToFetch]
        image_tags = [(image['imageTags'][0], image['imagePushedAt'].strftime('%Y-%m-%d %H:%M:%S')) for image in sorted_images]
        return image_tags
    

    在我的例子中,我将生成的对象列表转换为一个简单的菜单,用户只需在其中选择一个。

    【讨论】:

      猜你喜欢
      • 2016-12-13
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2011-03-08
      相关资源
      最近更新 更多