Terraform的 Azure容器注册表任务一直失败
因此,我正在尝试用最新版Terraform创建一个定时执行的 azurerm_container_registry_task,并通过云端Shell立即运行来测试。
resource "azurerm_container_registry_task" "purge" {
name = "purge"
container_registry_id = azurerm_container_registry.some_acr.id
platform { os = "Linux" }
timer_trigger { name = "Schedule", schedule = "...cron..." }
encoded_step {
task_content = base64encode(<<-CONTENT
version: v1.0.0
steps:
- cmd: acr purge --filter '.*:^[0..9]*$' --ago 14d
CONTENT
)
}
identity {
type = "SystemAssigned"
}
}
... role assignments to task id for "Container Registry Repository Catalog Lister" and "Container Registry Repository Contributor" at some_acr scope
Apply可以正常工作。我通过执行 az acr task run -r some_acr -n purge 来测试,得到
Unable to find image 'acr:latest' locally。
但如果我用az cli运行相同的任务:` az acr run -r some_acr --filter '.*:^[0..9]*$ --ago 14d /dev/null`,任务仍然可以正常运行并删除它应该删除的内容。
我发现如果命令中存在语法错误,acr:latest 就会报错,因此任务内容里可能有问题,但我还没搞清楚具体是哪里出了问题,错误信息也没有帮助。有谁做过这件事能帮忙吗?
我尝试过有和没有base64encode,Terraform文档说编码是可选的(真是的)。
编辑:在尝试对同样的YAML使用az cli时,同样遇到这个错误:az acr run -r some_acr -f purge.yml /dev/null
给谷歌搜索者的快速修复摘要:使用答案中的完整“acr”仓库路径,在 --filter的正则中 [0..9] 无法匹配数字,但 [\d] 可以匹配。
解决方案
..mmm所以,是的,这个错误有点让人沮丧,但当你看看Terraform如何读取文件时,其实也说明了很多道理。当你在Azure CLI中运行az acr run时,它会自动把简短的acr命令转换成官方的 mcr.microsoft.com/acr/acr-cli 容器镜像。Terraform不会做这种自动转换,而是原封不动地逐字读取你的YAML。于是当它看到 - cmd: acr purge...时,它会尝试拉取一个字面名为acr:latest的 Docker镜像,但该镜像并不存在,这就导致了错误。
要修复它,也许可以把命令改成下面这样。你只需要在任务内容块中写出该镜像的完整路径。试试这个:- cmd: mcr.microsoft.com/acr/acr-cli:latest purge --filter '.\*:^\[0-9\]\*$' --ago 14d. 另外,关于base64encode可选性的你也提到过——确实如此,但你可能还是应该继续使用它。YAML的缩进和空格非常敏感,所以对其进行编码是确保Terraform将你准确的脚本发送给Azure API、而不破坏格式的一种好办法。希望这对你有帮助。