用于清理的 ACR 任务,避免特定标签产生语法错误

问题描述 投票:0回答:1

我正在尝试创建将运行

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 syntax-error task acr
1个回答
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 purge
命令的 ACR 任务时,需要一个额外的反斜杠。 Terraform 要求使用另一个
\
来转义 cmd 的
\

通过命令行,您可以创建使用

acr purge
命令的 ACR 任务,如下所示:

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).)*$
匹配不包含latest
的字符串
。这意味着,当在
acr purge
命令中使用此正则表达式标记标签时,它不会删除带有
latest
dev-latest
latest-dev
的图像。如果您只想避免完全等于
latest
的标签,请改用此正则表达式:
^((?!^latest$).)*$
^(?!^latest$).*$

© www.soinside.com 2019 - 2024. All rights reserved.