使用 Azure 开发人员 CLI 部署到 Azure 容器应用

Azure 开发人员 CLI (azd) 支持 Azure 容器应用的两种部署策略:

  • 基于映像的策略。 将容器应用配置更新与映像部署分开。
  • 基于修订的策略。 将这两者结合为单个部署,并支持复杂部署模式。

以下各节介绍了这两种策略。

基于映像的部署策略

在此策略中,容器应用配置azd provision期间创建和更新,而容器映像azd deploy期间更新。

  • 容器应用定义(资源、环境变量、运行状况探测等)驻留在预配期间应用的 Bicep 模块 中。
  • 在部署期间,仅容器映像引用 (containers[0].image) 更改。

修订行为

每次更改应用配置或映像都会触发新的修订:

步骤 Command 将更改应用于 注释
1 azd provision 环境变量、资源、装载、探测、负载均衡器 创建新的修订
2 azd deploy 容器映像 创建一个新版本

每个修订都会在容器应用环境中分配其他副本,这可能会暂时增加资源使用量和成本。

注释

此策略不支持高级推出模式,如蓝绿或金丝雀。

配置基于映像的部署

若要确保 azd provision 更新现有容器应用而不覆盖最新部署的映像,请执行 更新或插入 操作。 此模式由 AVM container-app-upsert 模块实现,由两个步骤组成:

  1. 在你的 main.parameters.json 中,定义一个引用 azd 提供的变量 SERVICE_{NAME}_RESOURCE_EXISTS 的参数。 此变量在 azd 预配时自动设置,以指示资源是否已存在。

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environmentName": {
          "value": "${AZURE_ENV_NAME}"
        },
        "location": {
          "value": "${AZURE_LOCATION}"
        },
        // ... other parameters
        "apiExists": {
          "value": "${SERVICE_API_RESOURCE_EXISTS}"
        }
      }
    }
    
  2. 在 Bicep 文件中,引用 exists 参数来控制是应创建还是更新容器应用。 该模块在 container-app-upsert 内部封装此逻辑。

    @description('Indicates whether the container app resource already exists.')
    param apiExists bool
    
    module api 'br/public:avm/ptn/azd/container-app-upsert:0.1.2' = {
      name: 'api'
      params: {
        name: 'my-api'
        location: location
        containerAppsEnvironmentName: containerAppsEnvironment.name
        containerRegistryName: containerRegistry.name
        imageName: !empty(apiImageName) ? apiImageName : ''
        exists: apiExists
        env: [
          {
            name: 'MONGODB_CONNECTION_STRING'
            value: mongodb.outputs.connectionString
          }
        ]
        targetPort: 3100
      }
    }
    

    此方法允许 azd provision 在不手动检查的情况下,安全地 更新插入 容器应用资源(如果已存在则更新,如果不存在则创建)。

    小窍门

    apiVersionazure.yaml中保持与 Bicep 模块的apiVersion对齐,以避免不匹配。

基于修订的部署策略

在此策略中,容器应用定义映像azd deploy期间一起部署。

  • 容器应用配置驻留在部署期间应用的 专用 Bicep 模块 中。

  • 环境变量、映像、资源和负载均衡设置的更改作为 单个修订推出。

    小窍门

    此策略支持蓝绿、金丝雀和其他高级推出模式。

配置基于修订的部署

  1. 通过为服务创建基础结构文件来定义容器应用部署,例如 infra/api.bicep。 可以使用 基于 AVM 的模块直接定义资源来定义容器应用:

    @description('Unique environment name used for resource naming.')
    param environmentName string
    
    @description('Primary location for all resources.')
    param location string
    
    param containerRegistryName string
    param containerAppsEnvironmentName string
    param imageName string
    param identityId string
    
    resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' existing = {
      name: containerRegistryName
    }
    
    resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-03-01' existing = {
      name: containerAppsEnvironmentName
    }
    
    module api 'br/public:avm/res/app/container-app:0.8.0' = {
      name: 'api'
      params: {
        name: 'api'
        ingressTargetPort: 80
        scaleMinReplicas: 1
        scaleMaxReplicas: 10
        containers: [
          {
            name: 'main'
            image: imageName
            resources: {
              cpu: json('0.5')
              memory: '1.0Gi'
            }
          }
        ]
        managedIdentities: {
          systemAssigned: false
          userAssignedResourceIds: [identityId]
        }
        registries: [
          {
            server: containerRegistry.properties.loginServer
            identity: identityId
          }
        ]
        environmentResourceId: containerAppsEnvironment.id
        location: location
        tags: {
          'azd-env-name': environmentName
          'azd-service-name': 'api'
        }
      }
    }
    
  2. 在部署时通过创建参数文件(例如 api.parameters.json)来提供参数:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environmentName": { "value": "${AZURE_ENV_NAME}" },
        "location": { "value": "${AZURE_LOCATION}" },
        "containerRegistryName": { "value": "${AZURE_CONTAINER_REGISTRY_NAME}" },
        "containerAppsEnvironmentName": { "value": "${AZURE_CONTAINER_ENVIRONMENT_NAME}" },
        "imageName": { "value": "${SERVICE_API_IMAGE_NAME}" },
        "identityId": { "value": "${SERVICE_API_IDENTITY_ID}" }
      }
    }
    

    注释

    SERVICE_API_IMAGE_NAME 在部署期间动态设置,不属于预配输出。

    运行 azd deploy时,将使用上述资源定义应用容器应用修订版。

    小窍门

    如果容器应用引用了其他预配的资源,请将任何附加输出作为参数传递给azd deployazd provision

比较摘要

方面 基于映像 基于修订
Update 命令 azd provision + azd deploy azd deploy
推出类型 两个修订 单个修订
推出控制 azd管理 可配置(蓝绿,金丝雀)
用例 简单环境 高级部署
容器应用定义位置 预配时 Bicep 部署时 Bicep

其他资源