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 模块实现,由两个步骤组成:
在你的
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}" } } }在 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在不手动检查的情况下,安全地 更新插入 容器应用资源(如果已存在则更新,如果不存在则创建)。小窍门
apiVersion在azure.yaml中保持与 Bicep 模块的apiVersion对齐,以避免不匹配。
基于修订的部署策略
在此策略中,容器应用定义和映像在azd deploy期间一起部署。
容器应用配置驻留在部署期间应用的 专用 Bicep 模块 中。
环境变量、映像、资源和负载均衡设置的更改作为 单个修订推出。
小窍门
此策略支持蓝绿、金丝雀和其他高级推出模式。
配置基于修订的部署
通过为服务创建基础结构文件来定义容器应用部署,例如
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' } } }在部署时通过创建参数文件(例如
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 |