无法通过Azure Pipelines将ACR镜像部署至Azure Function问题排查
问题背景
使用Azure Pipelines将Azure容器注册表(ACR)中的镜像部署到Azure Function时,Pipelines任务显示执行成功,但Azure Function无法拉取镜像,启动日志报未授权:需要认证错误。同一镜像部署到Web App可正常运行,说明服务连接能正常访问ACR,且所有资源(Web App、Function、ACR)都在同一资源组,服务连接拥有订阅级权限,ACR管理员访问已启用。
核心错误日志
2023-07-27T00:01:26.211Z INFO - 拉取镜像: acrdevintegration.azurecr.io/apiintegtation:1662
2023-07-27T00:01:26.274Z ERROR - DockerApiException: Docker API返回状态码=InternalServerError, response={"message":"Get "https://acrdevintegration.azurecr.io/v2/apiintegtation/manifests/1662": unauthorized: authentication required, visit https://aka.ms/acr/authorization for more information."}
2023-07-27T00:01:26.274Z ERROR - 拉取docker镜像acrdevintegration.azurecr.io/apiintegtation:1662失败:
2023-07-27T00:01:26.321Z ERROR - DockerApiException: Docker API返回状态码=InternalServerError, response={"message":"Get "https://acrdevintegration.azurecr.io/v2/apiintegtation/manifests/1662": unauthorized: authentication required, visit https://aka.ms/acr/authorization for more information."}
2023-07-27T00:01:26.321Z WARN - 镜像拉取失败。默认使用本地副本(如果存在)。
2023-07-27T00:01:26.322Z ERROR - 镜像拉取失败: 验证docker镜像配置和凭据(如果使用私有仓库)
2023-07-27T00:01:26.323Z INFO - 停止站点azurefunction-dev-integration,因为它在启动期间失败。
所用Pipeline代码
trigger: - test resources: - repo: self variables: dockerRegistryServiceConnection: 'b78ea80b-5431-432a-a2e0-01a948ab3e60' imageRepository: 'apiintegtation' containerRegistry: 'acrdevintegration.azurecr.io' dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile' tag: '$(Build.BuildId)' vmImageName: 'ubuntu-latest' stages: - stage: Build displayName: 构建并推送阶段 jobs: - job: Build displayName: 构建 pool: vmImage: $(vmImageName) steps: - task: Docker@2 displayName: 构建镜像到容器注册表 inputs: containerRegistry: $(dockerRegistryServiceConnection) repository: $(imageRepository) command: 'build' Dockerfile: $(dockerfilePath) arguments: '--build-arg FOLDER=weather --build-arg PORT=3000' tags: | $(tag) latest - task: Docker@2 displayName: 推送镜像到容器注册表 inputs: containerRegistry: $(dockerRegistryServiceConnection) repository: $(imageRepository) command: 'push' tags: | $(tag) latest - task: AzureWebAppContainer@1 inputs: azureSubscription: 'Integration' appName: 'testimage123' containers: '$(containerRegistry)/$(imageRepository):$(tag)' - task: AzureFunctionAppContainer@1 inputs: azureSubscription: 'Integration' appName: 'azurefunction-dev-integration' imageName: '$(containerRegistry)/$(imageRepository):$(tag)'
排查与修复步骤
1. 补全AzureFunctionAppContainer任务的注册表参数
对比Web App和Function的部署任务:AzureWebAppContainer会自动关联服务连接的凭据,但AzureFunctionAppContainer需要显式指定containerRegistry参数才能将ACR凭据注入到Function App配置中。修改Pipeline中的Function部署任务:
- task: AzureFunctionAppContainer@1 inputs: azureSubscription: 'Integration' appName: 'azurefunction-dev-integration' imageName: '$(containerRegistry)/$(imageRepository):$(tag)' containerRegistry: '$(dockerRegistryServiceConnection)' # 新增此参数,指定ACR服务连接ID
2. 验证Function App的ACR凭据配置
登录Azure门户,进入目标Function App的容器设置页面:
- 确认是否已正确配置ACR的访问信息:服务器地址、用户名、密码需与ACR管理员账户一致,或使用拥有
AcrPull权限的服务主体凭据 - 若使用托管身份,需确保Function App的系统分配身份已启用,并为该身份授予ACR的
AcrPull角色权限,同时在容器设置中选择“使用托管身份”认证
3. 检查镜像名称拼写
注意日志中的镜像名apiintegtation是否存在拼写错误(比如应为apiintegration),登录ACR门户确认该镜像标签1662确实存在,避免因镜像不存在导致的拉取失败。
4. 排查网络限制
若ACR配置了虚拟网络访问限制:
- 确认Function App所在虚拟网络已加入ACR的允许列表
- 若Function App使用消费计划,需开启ACR的公共网络访问权限(消费计划无法直接接入虚拟网络访问私有ACR)
内容的提问来源于stack exchange,提问作者Samiran Mondal

