如何无需逐个指定仓库名即可批量清理Azure容器注册表(ACR)中所有仓库的镜像
自动生成ACR批量清理的Purge命令
手动给800个仓库写--filter确实太折磨人了!咱们可以用Azure CLI结合简单的文本处理,自动获取所有仓库并生成完整的清理命令,一步搞定。
完整的解决方案命令
直接运行下面的bash命令(记得把myregistry换成你的ACR名称):
# 1. 自动获取所有仓库并生成对应的--filter参数 FILTERS=$(az acr repository list --registry myregistry --output tsv | awk '{print "--filter '\''"$0":.*'\''"}' | tr '\n' ' ') # 2. 构建完整的清理命令 PURGE_CMD="acr purge $FILTERS --ago 1d --untagged --keep 7" # 3. 预览生成的命令(可选,确认没问题再执行下一步) echo $PURGE_CMD # 4. 创建定时清理任务 az acr task create --name PurgeACRImages \ --cmd "$PURGE_CMD" \ --schedule "5 6 * * 1" \ --registry myregistry \ --timeout 18000 \ --context /dev/null
各部分解释
- 获取仓库列表:
az acr repository list --registry myregistry --output tsv会以每行一个的格式输出ACR里所有仓库的名称,--output tsv确保输出没有多余的格式,方便后续处理。 - 生成filter参数:用
awk把每个仓库名转换成--filter '仓库名:.*'的格式,这里的单引号转义是为了在bash中正确传递字符串;tr '\n' ' '把所有换行符换成空格,让所有filter参数连成一串。 - 预览命令:建议先执行
echo $PURGE_CMD检查生成的命令是否正确,确认所有仓库都被包含在内,避免误操作。 - 创建任务:最后一步就是创建你原本的定时清理任务,现在的
PURGE_CMD已经自动包含了所有800个仓库的过滤规则。
注意事项
- 如果你的仓库名称包含特殊字符(不过ACR仓库名默认符合DNS规范,一般不会有这类问题),可以微调文本处理逻辑适配;
- 要是只想清理特定前缀的仓库,比如只处理
a开头的仓库,只需给az acr repository list加--prefix a参数即可。
内容的提问来源于stack exchange,提问作者Den Wahlin
相关产品推荐
相关产品推荐

