You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform部署Azure Container Apps时的镜像仓库认证问题

问题解决:Azure Container App部署时注册表认证报错

报错原因

你配置的azurerm_container_app需要拉取私有Azure容器注册表(ACR)的镜像,但当前registry块未提供任何认证信息。ACR默认是私有访问权限,必须通过托管身份或**ACR访问密钥(用户名/密码)**完成认证,这就是报错invalid registry config for Container App...must supply either identity or username/password_secret_name的原因。

这里的用户名/密码不是你的AD登录凭据,而是ACR专属的访问凭据——你本地az login的身份仅用于Terraform部署资源,但Container App运行时拉取镜像需要独立的认证方式,和部署身份无关。


解决方案1:使用托管身份(推荐)

这种方式无需硬编码密码,安全性更高,步骤如下:

  1. 给Container App启用系统分配托管身份
  2. 为该身份分配ACR的AcrPull角色,允许拉取镜像

修改后的Terraform代码:

resource "azurerm_container_app" "aca" {
  name = "${var.name_prefix}-aca"

  container_app_environment_id = azurerm_container_app_environment.app_env.id
  resource_group_name          = azurerm_resource_group.rg.name
  revision_mode                = "Single"

  # 启用系统分配托管身份
  identity {
    type = "SystemAssigned"
  }

  # 注册表配置:仅填写server,通过身份自动认证
  registry {
    server = "cregistry101010.azurecr.io"
  }

  ingress {
    allow_insecure_connections = false
    external_enabled           = true
    target_port                = 5050
    traffic_weight {
      percentage = 100
    }
  }

  template {
    container {
      name   = "app-data-svc"
      image  = "cregistry101010.azurecr.io/data-svc:latest" # 必须补全ACR服务器前缀
      cpu    = 0.25
      memory = "0.5Gi"
    }
  }
  tags = var.tags
}

# 给Container App的系统身份分配ACR的AcrPull角色
resource "azurerm_role_assignment" "aca_acr_pull" {
  scope                = azurerm_container_registry.your_acr.id # 替换为你的ACR资源ID
  role_definition_name = "AcrPull"
  principal_id         = azurerm_container_app.aca.identity[0].principal_id
}

解决方案2:使用ACR访问密钥(用户名/密码)

如果暂时不想用托管身份,可以用ACR的管理员访问密钥:

  1. 获取ACR的用户名和密码:

    • 登录Azure门户,进入你的ACR,在「设置」→「访问密钥」中开启管理员用户,复制用户名和密码
    • 或用Azure CLI命令:az acr credential show --name cregistry101010
  2. 修改Terraform代码,配置secret和注册表认证:

resource "azurerm_container_app" "aca" {
  name = "${var.name_prefix}-aca"

  container_app_environment_id = azurerm_container_app_environment.app_env.id
  resource_group_name          = azurerm_resource_group.rg.name
  revision_mode                = "Single"

  registry {
    server               = "cregistry101010.azurecr.io"
    username             = "cregistry101010" # ACR的管理员用户名
    password_secret_name = "acr-password"    # 对应下方secret的name
  }

  # 存储ACR密码的secret(建议用变量/密钥管理工具,不要硬编码)
  secret {
    name  = "acr-password"
    value = "你的ACR管理员密码"
  }

  ingress {
    allow_insecure_connections = false
    external_enabled           = true
    target_port                = 5050
    traffic_weight {
      percentage = 100
    }
  }

  template {
    container {
      name   = "app-data-svc"
      image  = "cregistry101010.azurecr.io/data-svc:latest" # 必须补全ACR服务器前缀
      cpu    = 0.25
      memory = "0.5Gi"
    }
  }
  tags = var.tags
}

注意:不要将密码硬编码到代码中,建议使用Terraform变量、Azure Key Vault或环境变量注入。


内容的提问来源于stack exchange,提问作者mike01010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:44:03