Azure Container App修订版:如何避免滚动更新(允许短停机)
针对Azure Container Apps含破坏性变更镜像的修订版更新方案
核心需求梳理
- 无破坏性变更镜像:通过
az containerapp revision copy更新镜像即可,无需特殊处理 - 含破坏性变更镜像:允许短时间停机,避免滚动更新(防止新旧版本同时运行引发数据库兼容问题)
替代停用操作的规范方案
方案1:创建全新修订版+全流量切换+缩容旧版本
- 基于当前配置创建带指定后缀的新修订版并更新镜像:
用az containerapp update --name <APP_NAME> --resource-group <RG_NAME> --image <NEW_IMAGE_TAG> --revision-suffix <NEW_REVISION_SUFFIX>--revision-suffix可明确区分新旧修订版,避免自动命名混淆。 - 将所有流量100%导向新修订版:
az containerapp traffic set --name <APP_NAME> --resource-group <RG_NAME> --revision <NEW_REVISION_NAME>=100 - 缩容旧修订版至0实例,彻底停止旧版本运行:
该操作比停用更直接,确保旧版本完全停止,不会被后续操作意外激活。az containerapp revision scale --name <APP_NAME> --resource-group <RG_NAME> --revision <OLD_REVISION_NAME> --instance-count 0
方案2:复制修订版+强制流量切换+缩容旧版本(适合复用旧配置场景)
- 复制当前修订版,指定新后缀并更新镜像:
az containerapp revision copy --name <APP_NAME> --resource-group <RG_NAME> --revision <OLD_REVISION_NAME> --new-revision-suffix <NEW_SUFFIX> --image <NEW_IMAGE_TAG> - 立即将流量全量切换到新修订版:
az containerapp traffic set --name <APP_NAME> --resource-group <RG_NAME> --revision <NEW_REVISION_NAME>=100 - 手动缩容旧修订版至0实例:
az containerapp revision scale --name <APP_NAME> --resource-group <RG_NAME> --revision <OLD_REVISION_NAME> --instance-count 0
停用旧修订版方法失效的原因
执行az containerapp revision copy时,系统默认基于当前活跃修订版配置创建新修订版,同时会自动激活新修订版。之前停用的修订版并非“消失”,而是默认不显示在常规列表中,可通过az containerapp revision list --name <APP_NAME> --resource-group <RG_NAME> --show-all查看所有修订版(含已停用的)。但这种方式容易导致新旧版本同时活跃,不符合避免滚动更新的需求。
流水线集成建议(Jenkins/GitLab)
- 将上述命令封装为流水线步骤,先执行数据库迁移脚本(若需),再依次完成创建新修订版、切换流量、缩容旧版本的操作
- 提前通过
az containerapp revision list获取当前活跃旧修订版名称,作为变量传入后续命令,避免硬编码修订版名称
内容的提问来源于stack exchange,提问作者honest_annie
相关产品推荐
相关产品推荐

