如何自动删除AWS ECR仓库中显示为“-”的无标签镜像?
自动清理AWS ECR无标签镜像的实现方案
方法一:ECR原生生命周期规则(最简便推荐)
直接通过ECR控制台配置托管式规则,无需编写代码:
- 打开AWS ECR控制台,进入目标仓库
- 切换到生命周期规则标签页,点击创建规则
- 配置规则细节:
- 规则名称:自定义,比如
clean-untagged-images - 筛选条件:选择标签状态为无标签
- 保留策略:可设置保留时长(比如保留最近7天的无标签镜像,避免误删刚推送的镜像),或直接设置保留数量为0(彻底删除所有无标签镜像)
- 确认后保存规则,ECR会自动按规则执行清理
- 规则名称:自定义,比如
方法二:AWS CLI脚本+定时任务(灵活自定义)
如果需要更个性化的清理逻辑,可编写CLI脚本,配合EventBridge定时执行:
- 示例bash脚本:
#!/bin/bash # 替换为你的仓库名和AWS区域 REPO_NAME="your-target-repo" REGION="cn-north-1" # 获取所有无标签镜像的摘要 UNTAGGED_DIGESTS=$(aws ecr list-images --repository-name $REPO_NAME --region $REGION --filter "tagStatus=UNTAGGED" --query 'imageIds[*].imageDigest' --output text) # 批量删除无标签镜像 if [ -n "$UNTAGGED_DIGESTS" ]; then aws ecr batch-delete-image --repository-name $REPO_NAME --region $REGION --image-ids $(echo $UNTAGGED_DIGESTS | awk '{for(i=1;i<=NF;i++) print "imageDigest="$i}') fi
- 定时执行配置:
- 将脚本上传至S3存储桶,或集成到Systems Manager文档中
- 在AWS EventBridge创建定时规则(比如每天凌晨2点执行)
- 选择执行目标为Systems Manager Automation或ECS任务,触发脚本运行
方法三:AWS Lambda自动化(高度可扩展)
适合需要结合额外业务逻辑的场景(比如按镜像创建时间筛选),用Lambda编写代码配合EventBridge定时触发:
- 示例Python代码:
import boto3 def lambda_handler(event, context): ecr_client = boto3.client('ecr', region_name='cn-north-1') repo_name = "your-target-repo" # 获取无标签镜像列表 image_list = ecr_client.list_images( repositoryName=repo_name, filter={'tagStatus': 'UNTAGGED'} ) image_ids = image_list.get('imageIds', []) if not image_ids: print("没有无标签镜像需要清理") return {'statusCode': 200, 'body': "无清理任务"} # 批量删除镜像 delete_result = ecr_client.batch_delete_image( repositoryName=repo_name, imageIds=image_ids ) deleted_count = len(delete_result.get('imageIdsDeleted', [])) print(f"成功删除{deleted_count}个无标签镜像") return {'statusCode': 200, 'body': f"已删除{deleted_count}个无标签镜像"}
- 配置步骤:
- 创建Lambda函数,为其添加包含
ecr:ListImages和ecr:BatchDeleteImage权限的IAM角色 - 在EventBridge创建定时触发规则,绑定该Lambda函数
- 测试函数执行,确认清理效果
- 创建Lambda函数,为其添加包含
内容的提问来源于stack exchange,提问作者Zakaria Ait Yakoub
相关产品推荐
相关产品推荐

