用于清理的 ACR 任务,避免特定标记出现语法错误

ACR task for cleanup avoiding specific tags giving syntax error

提问人:AnjK 提问时间:11/18/2023 更新时间:11/18/2023 访问量:44

问:

我正在尝试创建将运行 acr purge 命令以清理 ACR 注册表的 ACR 任务。

下面是用于 ACR 清理 3 个存储库的命令,但带有标记的存储库除外:latest

az acr run --cmd 'acr purge --filter '^dev\\/(repo1|repo2|repo_3)$:^((?!latest).)*$' --ago 5d --keep 4 --untagged --dry-run'  -c /dev/null -r acrregistry1

但是该命令返回错误:

-bash: !latest: event not found

然后我尝试更改命令以考虑带有任何标签的图像:

az acr run --cmd 'acr purge --filter '^dev\\/(repo1|repo2|repo_3)$:.*' --ago 5d --keep 4 --untagged --dry-run'  -c /dev/null -r acrregistry1

这再次返回一个错误:

-bash: syntax error near unexpected token `(' 

这是我缺少一些非常基本的 bash 的问题吗?

还是与不支持标签正则表达式中的负前瞻有关?az

已安装的 azure-cli 版本:2.53.1 *

bash azure 语法错误 任务 acr

评论

0赞 Imran 11/18/2023
我的 ACR 注册表中有这样的存储库,我曾经在运行 PowerShell 脚本时运行它,除了 infra/testimg2 使用最新标签,其余所有其他标签,存储库已删除检查这个你在寻找相同的吗?
0赞 shellter 11/18/2023
-bash: !latest: event not found指示尝试处理命令的 shell 的历史记录功能。使用 转义代码或参数中的任何字符。祝你好运。bash!\!
1赞 Imran 11/18/2023
试试这个并输出az acr run --cmd 'acr purge --filter '\''^dev\\/(repo1|repo2|repo_3)$:^((?!latest).)*$'\'' --ago 5d --keep 4 --untagged' -r acrregistry1 /dev/null
0赞 AnjK 11/20/2023
谢谢@Imran。这几乎奏效了。我已经在答案中补充了这一点。

答:

1赞 AnjK 11/20/2023 #1

谢谢@Imran,您提出的解决方案在从中删除一个后运行良好。\dev\\/dev\/

az acr run --cmd 'acr purge --filter '\''^dev\/(repo1|repo2|repo_3)$:^((?!latest).)*$'\'' --ago 5d --keep 4 --untagged --dry-run' -c /dev/null -r acrregistry1

使用 Terraform 创建使用该命令的 ACR 任务时,需要额外的反斜杠。Terraform 要求 cmd 使用另一个 .acr purge\\

通过命令行,可以创建使用如下命令的 ACR 任务:acr purge

az acr task create --cmd 'acr purge --filter '\''^dev\/(repo1|repo2|repo_3)$:^((?!latest).)*$'\'' --ago 5d --keep 4 --untagged --dry-run' -c /dev/null -r acrregistry1 --name testacrtask4

注意:尝试解码结果 JSON 中找到的 encodedStep 参数的值。验证 cmd 是否正确呈现。

您可以按如下方式运行任务,并验证命令是否按预期工作:

az acr task run -r acrregistry1 --name testacrtask4

如果面向完全专用的 ACR(可通过专用终结点访问),则需要按照此处提到的步骤(将 ACR 角色推送到任务的系统托管标识)才能使其正常工作。

注意:

正则表达式匹配不包含 的字符串。这意味着,当在命令中将此正则表达式用于标记时,它不会删除带有 、 和 的图像。如果只想避免使用完全等于 的标记,请改用以下正则表达式:或 。^((?!latest).)*$latestacr purgelatestdev-latestlatest-devlatest^((?!^latest$).)*$^(?!^latest$).*$