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

无法通过Azure Pipelines将ACR镜像部署至Azure Function问题排查

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:59:52