如何在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
相关产品推荐
相关产品推荐

