我正在尝试使用 Azure 管道将图像从 Azure 容器注册表部署到 Azure 函数,但它不起作用,以下是我的观察结果:
将相同的图像部署到网络应用程序时,它可以正常工作。这证明不是服务连接接入的问题。 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)'
经过大量故障排除后发现了问题。问题在于这两种资源的创建方式。 Web 应用程序是使用 ACR 中的 docker 映像(通过 Docker 选项卡)创建的,因此 Docker 用户名/密码和 url 在启动时嵌入到配置中。因此,随后对 Web 应用程序的部署成功,因为它包含 ACR 凭证。
但是由于azure函数在创建时不提供docker选项卡,所以我在没有任何图像的情况下创建了它。创建后,我使用管道将图像部署到该函数。因此,该函数没有 ACR 凭证,因此部署失败。
学习:
这是否可以解决通过arm模板创建函数应用程序后从注册表中提取图像的问题?