使用 Azure 开发人员 CLI 进行应用服务容器部署

Azure开发人员 CLI (azd) 可以将应用部署到Azure 应用服务。 此部署模式将应用作为适用于容器的 Linux Web 应用运行。 在服务使用host: appservice并采用基于 Docker 的构建时,azd deploy会构建映像,将其推送到 Azure 容器注册表 (ACR),并使现有的 App Service 站点指向该新映像。

由于 azd deploy 仅更新映像引用,因此在部署之前,基础结构必须准备好站点容器。 了解此部署模式有助于正确设置站点并避免部署失败。

本文介绍该部署模式的工作原理、基础结构必须已配置的内容,以及它与 containerapp 主机有何不同。 它假定你熟悉 azd 项目, azure.yaml以及 azd 预配和部署命令。

azd 如何将容器部署到应用服务

使用容器配置设置 host: appservice 服务时, azd deploy 将目标站点视为 用于容器的 Web 应用 ,并执行以下操作:

  • 从 Dockerfile 生成容器映像。
  • 将映像推送到基础结构定义的 ACR 实例。
  • 将网站的 linuxFxVersion 设置更新为 DOCKER|<image>,以便网站运行你的映像。

azd deploy 仅更新现有站点的映像引用。 它不会创建或配置底层基础结构,因此在部署之前,站点必须已准备好容器。

azure.yaml 中的服务配置

部署到 App Service 的容器使用 host: appservice,并采用基于 Docker 的构建。 设置 language: docker,或添加指向您的 Dockerfile 的 docker 配置项:

services:
  web:
    project: ./src/web
    host: appservice
    language: docker
    docker:
      path: ./Dockerfile

使用此配置, azd 从 ./src/web/Dockerfile中生成映像,将其推送到注册表,并更新应用服务站点以运行映像。 主机 appservice 不会应用服务级别 env: 设置,因此请改为通过基础结构配置应用设置。

容器就绪应用服务站点的基础结构要求

azd deploy不会为appservice主机预配或修改基础结构,因此,在部署之前,现有Bicep或 Terraform 必须将站点配置为 Linux 容器应用。 基础结构必须满足以下协定:

要求 详细信息
Linux 应用服务计划 该方案运行 Linux(kind: linux,配合 reserved: true)。 应用服务仅支持 Linux 上的容器,而不支持Windows。
容器就绪站点 网站的 linuxFxVersion 使用 DOCKER\| 值。 可以使用占位符映像,因为 azd deploy会使用它生成并推送的映像替换该映像。
单个容器 该站点运行一个容器。 主机 appservice 不支持多容器或 Docker Compose 配置。
使用托管标识访问 ACR 站点通过用户分配的托管身份向 ACR 进行身份验证,例如使用 acrUseManagedIdentityCreds: true 和 acrUserManagedIdentityID。 主机 appservice 不支持管理员凭据。

azd deploy 与 provision 和 up 的比较

容器部署到应用服务涉及两个问题:基础结构和应用程序代码,这些代码映射到不同的 azd 命令:

命令 它的作用是什么 何时使用它
azd provision 根据 Bicep 或 Terraform 创建和配置 Azure 资源,包括支持容器的应用服务站点和 ACR。 当基础设施发生变化或站点尚不存在时,使用它。
azd deploy 生成映像,将其推送到 ACR,并更新站点的映像引用。 它不会触摸基础结构。 使用它将应用程序更改寄送到已预配的站点。
azd up 通过一条命令依次运行 azd provision 和 azd deploy。 首次部署时,或需要一并进行预配和部署时,请使用此项。

由于 azd deploy 仅更新映像引用, appservice 因此容器部署始终依赖于之前 azd provision 或 azd up 创建的基础结构。

部署就绪情况验证

在更新站点之前,azd deploy会验证目标站点是否已做好容器准备。 例如,如果站点不是 Linux 容器应用,使用的是 Windows 计划,缺少 DOCKER|linuxFxVersion 值,或者没有用于访问 ACR 的托管标识权限,那么 azd deploy 将停止并返回一条错误,指出缺少的配置。 在再次部署之前,请先更正基础架构并重新预配资源。

App Service 容器与容器应用的比较

appservice和containerapp主机都部署容器映像,但它们以不同的方式管理基础结构和配置:

Behavior appservice 主机 containerapp 主机
基础结构配置 azd deploy 仅更新镜像引用,并要求站点已具备容器运行条件。 为你预配并配置更多容器运行时环境。
环境变量 不应用服务级别 env: 设置。 请改为通过基础结构配置应用设置。 将服务级别 env: 设置应用于容器。
多语言支持 通过 language: docker 将任何语言编写的应用容器化,这对于没有内置 azd 支持的运行时非常有用。 通过 language: docker 将任何语言编写的应用程序容器化,这对于没有内置 azd 支持的运行时非常有用。