如何删除AWS ECR中的未标记和旧的镜像?
Amazon ECR与Amazon Elastic Kubernetes Service(Amazon EKS)、Amazon Elastic Container Service(Amazon ECS)和AWS Lambda集成,简化了您的开发至生产工作流程。
Amazon ECR以高度可扩展和可用的架构托管图像,使您能够为应用程序提供可靠的托管。删除未标记和旧图像以保持卫生非常重要。
现在,应用程序以微服务运行。微服务是指将所有代码及其依赖项捆绑在一起的容器,使应用程序能够在任何计算环境中快速可靠地运行。由于其可移植性、小巧和便利性,容器正成为现代应用程序的首选方法。
容器是从名为映像的只读模板设计的。这些映像需要存储在某个地方,以便任何经过授权的机器都可以检索到它们。
这就是容器注册表的作用。不久前,人们使用DockerHub来存储这些映像和构件。但是,如果您正在使用AWS服务,那么我相信您已经在使用AWS ECR,它是DockerHub的替代品。
AWS ECR是一个完全托管的容器注册表,提供高性能托管,可让您以公开和私有存储库的形式部署应用程序映像和构件。
每天,多个托管在AWS上的应用程序将数百万个映像/应用程序构件推送到特定的ECR存储库中。
在本文中,我们将讨论如何清除旧的和过时的AWS ECR并保持ECR存储库的干净。
需求:立即删除未标记和旧图片!
清理ECR存储库的主要原因是开发卫生。任何时候,没有人希望在他们的ECR中保留比十个部署旧的图像。这也是因为行业经常发生回滚,但很少有回滚会回退到5个部署之前的更改。
简单来说,任何超过五个部署旧的图像/构件都是无用的。这可能会受到组织策略报告的变化影响,但我们不建议将其作为最佳实践。
在整个行业中,标记用于指定最稳定的最新或最近的五个图像。作为部署过程的一部分,这些图像会快速生成,并且这些标记会被新的图像替换,使旧的图像处于未标记和无用的状态。
在这种情况下,如果图像/构件很大,还会增加ECR的存储费用。AWS ECR的定价为“每个私有或公共存储库中存储的数据每GB每月0.10美元”。
这个价格对您来说可能看起来很小,但正如他们所说,无形之中形成了实质。如果将所有这些图像放在存储区域以供更长时间使用,将会增加您AWS账单的费用。
建议是将这些旧的和未标记的图像清除出您的ECR存储库,因为您不需要它们!简单!为什么要保留它并为它付费呢?
手动删除AWS ECR映像
方法1:GUI方式!
步骤1:登录到Amazon Web Services账户并转到要清除的存储库。
步骤2:在这里,您可以看到存储库有最新的标签来指定最稳定的版本。您看到的其他标签可以称为未标记。要删除,我们只需要选择图像然后点击删除。
步骤3:确认删除
方法2:CLI方式!
要使用CLI删除图像,您需要在计算机上配置所有AWS IAM访问密钥,并具有所需的IAM权限以让您访问存储库。
在这种情况下,我们已经配置好了。如果您还没有配置,可以在Amazon Web Services上进行配置。
如果不确定是否已在计算机上配置了AWS CLI,请使用以下命令进行验证。
aws sts get-caller-identity
现在我们已经确认可以使用AWS CLI,您可以使用以下命令删除未标记的ECR映像。
aws ecr batch-delete-image --repository-name test-ecr-policy --image-ids imageTag=custom-image-6
这里我们正在做与GUI中相似的事情。我们将删除存储在test-ecr-policy库中自定义映像标记为custom-image-6的映像。
方法3:脚本方式!
此方法的先决条件是在您运行的计算机上配置了AWS访问密钥。
删除未标记的映像的脚本。
import boto3
client = boto3.client('ecr')
response = client.list_images(repositoryName='test-ecr-policy')
untaggedImageList = [image for image in response['imageIds'] if image['imageTag'] == 'custom-build-4']
response2 = client.batch_delete_image(repositoryName='aws-test-ecrpolicy', imageIds=untaggedImageList)
print(response2)
响应将给出您已删除的映像ID列表,以及如果有任何失败。
定期删除ECR映像的调度方法
如果您是一名工程师或定期管理AWS ECR,您已经知道手动删除这些映像的痛苦。
运行脚本/命令确实使事情变得更容易,但我们肯定您希望有一些可以自动删除这些映像的东西,而无需担心它们。
好消息是,AWS ECR为您的映像提供了一个生命周期策略,您可以设置该策略以按时或按计划删除这些映像。让我们看看如何做到这一点。
方法1:GUI方式!
步骤1:转到您要设置生命周期策略的存储库。在左侧面板上,您可以看到生命周期策略。您可以单击它以开始使用。
步骤2:您可以单击它并创建您的第一个规则。
步骤3:ECR允许您在两种情况下删除映像,一种是如果映像指定的天数超过或者它们被标记/未标记,并且您只想保留它们一定数量的天数。
让我们看看如何操作。现在,您可以设置是否要在未标记的映像一天或更旧时删除它们,或者如果未标记的映像计数超过一个时。
根据您的用例进行选择。不要忘记,您可以将这些数字增加到您选择的数字。保存以触发生命周期规则。
方法2:CLI方式!
设置生命周期策略的AWS ECR CLI命令是 put-lifecycle-policy.
让我们看看如何操作。为此,您必须创建一个列出策略条件的JSON文件。您可以将其命名为policy.json或任何您选择的名称。
但在此之前,让我们看看生命周期策略元素。
rulePriority (Type: integer, Required: yes):
从低到高的规则顺序。生命周期策略规则的优先级为1的首先应用,然后是2,依此类推。生命周期策略规则必须具有唯一的规则值。
策略规则不需要连续的值。任何标记的规则必须具有最高的rulePriority并且最后进行审查。
description (Type: string, Required: no):
解释生命周期策略中的规则用途。
tagStatus (Type: string, Required: yes):
它检查是否已添加生命周期策略规则指定了映像标记。标记、未标记或任何都可以。如果未指定,则评估所有映像。标记需要一个tagPrefixList值。未标记需要省略tagPrefixList。