我一直在尝试部署一个已经推送到我们的 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)
传递的变量相同。
您收到错误是因为您没有使用 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
: