Terraform的 Azure容器注册表任务一直失败

后端开发 2026-07-08

因此,我正在尝试用最新版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、而不破坏格式的一种好办法。希望这对你有帮助。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章