You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Action CI/CD流水线中更新Azure Container App镜像?

Azure Container App通过GitHub Action更新镜像时认证错误的解决方法

问题描述

使用Azure门户创建了基于DockerHub默认镜像的Azure Container App,尝试通过GitHub Action中的az containerapp update命令部署实际代码时遇到认证错误,其他配置项可正常更新,但镜像及镜像仓库无法变更。

错误日志

ERROR: (InvalidParameterValueInContainerTemplate) The following field(s) are either invalid or missing. Field 'template.containers.simple-hello-world-container.image' is invalid with details: 'Invalid value: "***/demo-api:1.0.1": GET https:?scope=repository%3Ademo-api%3Apull&service=***: UNAUTHORIZED: authentication required, visit https://aka.ms/acr/authorization for more information.';

提供的GitHub Action代码

on: push 

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    
    - uses: actions/checkout@v3

    - name: Load dotenv
      id: dotenv
      uses: falti/dotenv-action@v1.0.4
      with:
        path: .env
        log-variables: true
        export-variables: true
        keys-case: bypass
    
    - name: Log into Azure Container Registry
      uses: docker/login-action@v2
      with:
        registry: ${{ secrets.ACR_SERVER }}
        username: ${{ secrets.AZURE_CLIENT_ID }}
        password: ${{ secrets.AZURE_CLIENT_SECRET }}

    - name: Build image
      run: |        
        docker build \
          -t ${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }} .

    - name: Re-Tag image For ACR
      run: |
        docker tag ${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }} ${{ secrets.ACR_SERVER }}/${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }}
    
    - name: Push image to ACR
      run: |
        docker push ${{ secrets.ACR_SERVER }}/${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }}

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
    
    - uses: actions/checkout@v3

    - name: Load dotenv
      id: dotenv
      uses: falti/dotenv-action@v1.0.4
      with:
        path: .env
        log-variables: true
        export-variables: true
        keys-case: bypass

    - name: Azure login  
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - name: Azure Deploy App
      uses: azure/CLI@v1
      with:
        inlineScript: |
          az containerapp update \
          --name ca-demoapi \
          --resource-group rg-ca \
          --image ${{ secrets.ACR_SERVER }}/${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }}
          --cpu 1.0 \
          --memory 2.0Gi \
          --min-replicas 0 \
          --max-replicas 2 \
          --scale-rule-name http-rule-10-req \
          --scale-rule-type http \
          --scale-rule-http-concurrency 10   
          --container-name ${{ steps.dotenv.outputs.IMAGE_NAME }} \
          --ingress 'external' 


    - name: Azure CLI script
      uses: azure/CLI@v1
      with:
        inlineScript: |
          az logout
          az cache purge
          az account clear    

解决方案

1. 为Container App配置ACR访问权限

当前容器应用使用的是DockerHub的凭据,无法访问Azure Container Registry(ACR),需要配置ACR的拉取权限,有两种推荐方式:

方式一:使用Azure AD托管标识(推荐)

  • 为Container App启用系统分配或用户分配的托管标识。
  • 为该托管标识分配ACR的AcrPull角色权限(在ACR的IAM权限设置中添加角色分配)。
  • 在az containerapp update命令中添加标识参数和注册表服务器信息:
    az containerapp update \
      --name ca-demoapi \
      --resource-group rg-ca \
      --image ${{ secrets.ACR_SERVER }}/${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }} \
      --registry-server ${{ secrets.ACR_SERVER }} \
      --identity <你的托管标识ID或名称> \
      # 其他配置参数...
    

方式二:使用ACR管理员凭据

  • 在GitHub Secrets中存储ACR的管理员用户名(ACR_USERNAME)和密码(ACR_PASSWORD)。
  • 在部署步骤中先配置Container App的镜像仓库凭据:
    az containerapp registry set \
      --name ca-demoapi \
      --resource-group rg-ca \
      --server ${{ secrets.ACR_SERVER }} \
      --username ${{ secrets.ACR_USERNAME }} \
      --password ${{ secrets.ACR_PASSWORD }}
    
  • 之后再执行az containerapp update命令更新镜像。

2. 修正az containerapp update命令的语法错误

原命令中--image行末尾缺少反斜杠,导致后续参数被解析为独立命令,引发执行异常。修正后的命令需确保每个参数行末尾都添加反斜杠:

az containerapp update \
  --name ca-demoapi \
  --resource-group rg-ca \
  --image ${{ secrets.ACR_SERVER }}/${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }} \
  --cpu 1.0 \
  --memory 2.0Gi \
  --min-replicas 0 \
  --max-replicas 2 \
  --scale-rule-name http-rule-10-req \
  --scale-rule-type http \
  --scale-rule-http-concurrency 10 \
  --container-name ${{ steps.dotenv.outputs.IMAGE_NAME }} \
  --ingress 'external'

3. 提前验证镜像拉取权限(可选)

在部署步骤中添加镜像拉取验证,提前排查权限问题:

- name: Verify ACR image accessibility
  uses: docker/login-action@v2
  with:
    registry: ${{ secrets.ACR_SERVER }}
    username: ${{ secrets.ACR_USERNAME }}
    password: ${{ secrets.ACR_PASSWORD }}
- name: Pull test image
  run: docker pull ${{ secrets.ACR_SERVER }}/${{ steps.dotenv.outputs.IMAGE_NAME }}:${{ steps.dotenv.outputs.IMAGE_TAG }}

内容的提问来源于stack exchange,提问作者Mahajan344

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:15:59