Azure 容器应用程序:Azure 容器注册表身份验证问题

问题描述 投票:0回答:1

我一直在尝试部署一个已经推送到我们的 azure 容器注册表中的 docker 映像。我收到以下错误:

/usr/bin/az containerapp update -n <appName> -g <resourceGroupName> -i <containerRegistry>.azurecr.io/<repository>:20240430.13 --replace-env-vars ASPNETCORE_ENVIRONMENT=Acceptance
ERROR: (InvalidParameterValueInContainerTemplate) The following field(s) are either invalid or missing. Field 'template.containers.<appName>.image' is invalid with details: 'Invalid value: "<containerRegistry>.azurecr.io/<repository>:20240430.13": GET https:?scope=repository%3A<containerRegistry>%3Apull&service=<containerRegistry>.azurecr.io: UNAUTHORIZED: authentication required, visit https://aka.ms/acr/authorization for more information.';.
##[error]Error Code: [1]
##[error]Error: Unable to update Azure Container App via 'az containerapp update' command.

如您所见,它给出了有关注册表身份验证过程的错误。这是我用于部署的作业:

jobs:
- job: Deploy
  displayName: Deploy Docker image
  steps:
    - task: AzureContainerApps@1
      displayName: 'Deploy from container registry'
      inputs:
        resourceGroup: $(resourceGroupName)
        azureSubscription: ${{parameters.devopsServiceConnection}}
        containerAppEnvironment: $(containerAppEnvironment)
        containerAppName: $(appName)
        acrName: $(containerRegistry)
        imageToDeploy: $(containerRegistry).azurecr.io/$(repository):$(Build.BuildNumber)
        environmentVariables: 'ASPNETCORE_ENVIRONMENT=Acceptance'

以下是我所知道/已排除的内容:

  • 从日志来看,当它运行

    az login
    (任务的一部分)时,它返回了它有权访问的订阅列表。
    azureSubscription
    (ACC)上传递的服务连接包括

  • 运行时

    az account set --subscription <tenant_id>
    它是上面指定的订阅的租户ID。

  • 它使用 Azure CLI 生成的令牌(可以访问 ACC 订阅)登录到容器注册表

    Logging in to Azure Container Registry using access token to be generated via Azure CLI.
    /usr/bin/bash -c CA_ADO_TASK_ACR_ACCESS_TOKEN=$(az acr login --name <containerRegistry> --output json --expose-token --only-show-errors | jq -r '.accessToken'); docker login <containerRegistry>.azurecr.io -u 00000000-0000-0000-0000-000000000000 -p $CA_ADO_TASK_ACR_ACCESS_TOKEN > /dev/null 2>&1
    

    但这确实会在控制台中返回一个空行。 (可能很重要?)我想这也可能是因为敏感数据被截断,否则它会无限期地保存在日志中。

  • 验证完以上所有内容后,我检查了订阅访问权限。我尝试部署到的容器注册表和容器应用程序都在 ACC 订阅下。我检查了我们的项目设置以查看服务连接设置,该设置可以完全访问 ACC 订阅(其中包括

    AcrPull
    AcrPush

我已经搞砸了几个小时了,希望其他人也有同样的问题可以帮助我解决它。

我删除了许多对我公司敏感的数据。但如果您看到

<appName>
,我已经验证它与通过
$(appName)
传递的变量相同。

azure azure-devops azure-pipelines azure-container-registry
1个回答
0
投票

您收到错误是因为您没有使用 acr 凭据,要更新映像或从容器注册表添加映像,您需要启用

admin user
并使用
username
password

我部署了一个简单的 Flask 应用程序

这对我有用

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- main

pool:
  vmImage: ubuntu-latest

jobs:
  - job: Deploy
    displayName: Deploy Docker Image
    steps:
      - task: AzureContainerApps@1
        displayName: deploy from conatiner registry
        inputs:
          resourceGroup: vshandilya
          azureSubscription: <My service connection name>
          acrName: vshandilyaacr
          acrUsername: <my username>
          acrPassword: <my acr password>
          containerAppEnvironment: managedEnvironment-vshandilya-abf1
          containerAppName: dockerflask
          imageToDeploy: vshandilyaacr.azurecr.io/azureflask:docker

app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello():
    message = "Greetings! Wecome to Flask App"
    return message

app.run(host='0.0.0.0', port=5000)

OUTPUT

© www.soinside.com 2019 - 2024. All rights reserved.