使用 Azure Developer CLI (azd) 将容器化应用部署到 Azure Container Apps。适用于 azd 项目初始化、编写 azure.yaml 配置、创建 Container Apps 的 Bicep 基础设施、配置 ACR 远程构建、实现幂等部署、管理本地/.azure/Bicep 环境变量及排查 azd up 失败。触发场景包括 azd 配置、Container Apps 部署、多服务部署和 Bicep 基础设施即代码请求。
Azure 开发者 CLI (azd) 集装箱应用软件部署.是一项面向实际任务的技能,主要用于Deptroduced Controducal Apps 将集装箱化的前端+后端应用软件部署到 Azure 集装箱应用软件,并具有远程构建,管理的身份和独家基础设施。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
将容器化的前端 + 后端应用部署到 Azure Container Apps,支持远程构建、托管标识(Managed Identity)和幂等基础设施。
# 初始化并部署 azd auth login azd init # 创建 azure.yaml 和 .azure/ 目录 azd env new# 创建环境(dev、staging、prod) azd up # 部署基础设施 + 构建 + 部署
project/ ├── azure.yaml # azd 服务定义 + 钩子(hooks) ├── infra/ │ ├── main.bicep # 根基础设施模块 │ ├── main.parameters.json # 从环境变量注入参数 │ └── modules/ │ ├── container-apps-environment.bicep │ └── container-app.bicep ├── .azure/ │ ├── config.json # 默认环境指向配置 │ └──/ │ ├── .env # 环境专属值(由 azd 管理) │ └── config.json # 环境元数据 └── src/ ├── frontend/Dockerfile └── backend/Dockerfile
name: azd-deployment
services:
backend:
project: ./src/backend
language: python
host: containerapp
docker:
path: ./Dockerfile
remoteBuild: true
name: azd-deployment
metadata:
template: my-project@1.0.0
infra:
provider: bicep
path: ./infra
azure:
location: eastus2
services:
frontend:
project: ./src/frontend
language: ts
host: containerapp
docker:
path: ./Dockerfile
context: .
remoteBuild: true
backend:
project: ./src/backend
language: python
host: containerapp
docker:
path: ./Dockerfile
context: .
remoteBuild: true
hooks:
preprovision:
shell: sh
run: |
echo "部署前执行..."
postprovision:
shell: sh
run: |
echo "部署后执行 —— 配置 RBAC 等操作"
postdeploy:
shell: sh
run: |
echo "前端地址: ${SERVICE_FRONTEND_URI}"
echo "后端地址: ${SERVICE_BACKEND_URI}"
| 选项 | 说明 |
|---|---|
remoteBuild: true |
在 Azure Container Registry 中构建镜像(推荐) |
context: . |
Docker 构建上下文,相对于 project 路径 |
host: containerapp |
部署至 Azure Container Apps |
infra.provider: bicep |
使用 Bicep 管理基础设施 |
.env — 仅用于本地开发.azure//.env — 由 azd 管理,自动从 Bicep 输出填充main.parameters.json — 将环境变量映射为 Bicep 参数// infra/main.parameters.json
{
"parameters": {
"environmentName": { "value": "${AZURE_ENV_NAME}" },
"location": { "value": "${AZURE_LOCATION=eastus2}" },
"azureOpenAiEndpoint": { "value": "${AZURE_OPENAI_ENDPOINT}" }
}
}
语法:${VAR_NAME} 或 ${VAR_NAME=default_value}
# 为当前环境设置变量 azd env set AZURE_OPENAI_ENDPOINT "https://my-openai.openai.azure.com" azd env set AZURE_SEARCH_ENDPOINT "https://my-search.search.windows.net" # 初始化时设置 azd env new prod azd env set AZURE_OPENAI_ENDPOINT "..."
// 在 main.bicep 中 — 输出项将自动填充至 .azure//.env output SERVICE_FRONTEND_URI string = frontend.outputs.uri output SERVICE_BACKEND_URI string = backend.outputs.uri output BACKEND_PRINCIPAL_ID string = backend.outputs.principalId
通过 Azure 门户添加的自定义域名可能在重新部署时丢失。可通过钩子进行保留:
hooks:
preprovision:
shell: sh
run: |
# 部署前保存自定义域名
if az containerapp show --name "$FRONTEND_NAME" -g "$RG" &>/dev/null; then
az containerapp show --name "$FRONTEND_NAME" -g "$RG"
--query "properties.configuration.ingress.customDomains"
-o json > /tmp/domains.json
fi
postprovision:
shell: sh
run: |
# 校验或恢复自定义域名
if [ -f /tmp/domains.json ]; then
echo "已保存域名: $(cat /tmp/domains.json)"
fi
// 引用已有 ACR(不重建)
resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-07-01' existing = {
name: containerRegistryName
}
// 将 customDomains 设为 null,以保留门户中添加的域名
customDomains: empty(customDomainsParam) ? null : customDomainsParam
同一环境内容器应用之间的内部 HTTP 路由:
// 前端环境变量中引用后端
env: [
{
name: 'BACKEND_URL'
value: 'http://ca-backend-${resourceToken}' // 内部 DNS
}
]
前端 nginx 反向代理至该内部 URL:
location /api {
proxy_pass $BACKEND_URL;
}
resource containerApp 'Microsoft.App/containerApps@2024-03-01' = {
identity: {
type: 'SystemAssigned'
}
}
output principalId string = containerApp.identity.principalId
hooks:
postprovision:
shell: sh
run: |
PRINCIPAL_ID="${BACKEND_PRINCIPAL_ID}"
# 授予 Azure OpenAI 访问权限
az role assignment create
--assignee-object-id "$PRINCIPAL_ID"
--assignee-principal-type ServicePrincipal
--role "Cognitive Services OpenAI User"
--scope "$OPENAI_RESOURCE_ID" 2>/dev/null || true
# 授予 Azure AI Search 访问权限
az role assignment create
--assignee-object-id "$PRINCIPAL_ID"
--role "Search Index Data Reader"
--scope "$SEARCH_RESOURCE_ID" 2>/dev/null || true
# 环境管理 azd env list # 列出所有环境 azd env select# 切换至指定环境 azd env get-values # 显示全部环境变量 azd env set KEY value # 设置环境变量 # 部署 azd up # 完整部署:基础设施 + 构建 + 应用部署 azd provision # 仅部署基础设施 azd deploy # 仅部署代码 azd deploy --service backend # 仅部署 backend 服务 # 调试 azd show # 显示项目当前状态 az containerapp logs show -n -g --follow # 实时流式输出日志
remoteBuild: true —— 在 M1/ARM Mac 上对 AMD64 平台执行本地构建会失败azd env set 设置密钥类变量 —— 不应写入 main.parameters.json 的默认值中azd-service-name) —— azd 依赖此标签识别并管理 Container Apps|| true —— 防止因 RBAC 权限“已存在”导致部署失败相关专题
热门下载
相关下载
精品课程
共6课时 | 54.6万人学习
共89课时 | 133.4万人学习
共49课时 | 82.2万人学习