无法将图像从 ACR 部署到 azure 功能,但使用 azure 管道部署到 Web 应用程序可以正常工作

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

我正在尝试使用 Azure 管道将图像从 Azure 容器注册表部署到 Azure 函数,但它不起作用,以下是我的观察结果:

  • azure DevOps 中的作业很成功,但我在 Functions 中看不到任何图像。

Azure Function image

  • 将相同的图像部署到网络应用程序时,它可以正常工作。这证明不是服务连接接入的问题。 i:e 它能够从 ACR 中提取图像。

  • 服务连接具有订阅级别访问权限,并且所有资源 Web 应用程序、功能和 acr 都位于同一资源组中。

  • 从高级工具-->当前 Docker 日志输出中,它给了我身份验证问题。但我在 ACR 中的管理员访问权限已启用,并且 Web 应用程序的服务连接工作正常。

2023-07-27T00:01:26.211Z 信息 - 拉取映像:acrdevintegration.azurecr.io/apiintegtation:1662 2023-07-27T00:01:26.274Z 错误 - DockerApiException:Docker API 响应状态代码=InternalServerError,响应={“message”:“获取”https://acrdevintegration.azurecr.io/v2/apiintegtation/manifests/1662 “:未经授权:需要身份验证,请访问 https://aka.ms/acr/authorization 了解更多信息。”}

2023-07-27T00:01:26.274Z 错误 - 拉取 docker 映像 acrdevintegration.azurecr.io/apiintegtation:1662 失败: 2023-07-27T00:01:26.321Z 错误 - DockerApiException:Docker API 响应状态代码=InternalServerError,响应={“message”:“获取”https://acrdevintegration.azurecr.io/v2/apiintegtation/manifests/1662 “:未经授权:需要身份验证,请访问 https://aka.ms/acr/authorization 了解更多信息。”}

2023-07-27T00:01:26.321Z 警告 - 镜像拉取失败。如果存在,则默认为本地副本。 2023-07-27T00:01:26.322Z 错误 - 映像拉取失败:验证 docker 映像配置和凭据(如果使用私有存储库) 2023-07-27T00:01:26.323Z 信息 - 停止站点 azurefunction-dev-integration,因为它在启动过程中失败。

  • 下面是我的azure管道代码,让我知道哪里出错了。

    触发:

    • 测试

    资源:

    • 回购:自我

    变量:

    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: Build and push stage
      jobs:
      - job: Build
        displayName: Build
        pool:
          vmImage: $(vmImageName)
        steps:
        - task: Docker@2
          displayName: Build an image to container registry
          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: Push an image to container registry
          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: enter image description here

enter image description here

azure azure-functions azure-pipelines devops
2个回答
0
投票

经过大量故障排除后发现了问题。问题在于这两种资源的创建方式。 Web 应用程序是使用 ACR 中的 docker 映像(通过 Docker 选项卡)创建的,因此 Docker 用户名/密码和 url 在启动时嵌入到配置中。因此,随后对 Web 应用程序的部署成功,因为它包含 ACR 凭证。

但是由于azure函数在创建时不提供docker选项卡,所以我在没有任何图像的情况下创建了它。创建后,我使用管道将图像部署到该函数。因此,该函数没有 ACR 凭证,因此部署失败。

学习:

  • 服务连接仅负责与azure功能连接。不适用于从 ACR 中提取图像。该函数自行完成。因此,永远不要忘记在配置设置中添加 ACR 凭据。
  • 配置中的应用程序设置预填充了 DOCKER_REGISTRY_SERVER_URL、PASSWORD 和 USERNAME 等名称,但值是空的。我从未单击隐藏值来检查它是否确实具有这些用户名和密码。

enter image description here


0
投票

这是否可以解决通过arm模板创建函数应用程序后从注册表中提取图像的问题?

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