Azure Devops - 使用 docker 和 Azure 容器注册表 (ACR) 发布管道 - 标记问题
Azure Devops - release pipeline with docker and Azure Container Registry (ACR) - problem with tag
我有一个非常奇怪(而且我想很容易解决)的问题 :) 我正在尝试在 Azure 中建立一个有效的 CI/CD 管道。为此,我在 Azure devops 中创建了一个存储库,并创建了构建和发布管道。我正在将 docker 图像发布到 Azure 容器注册表,并且在发布期间,我正在拉取此图像(或者至少 - 我正在尝试,因为它不起作用)并且我正在尝试将其发布到容器的 Webapp 上。在我的例子中,"app" 是 .NET Core 3.1 上的 SingalR 集线器(但我不认为它对我遇到的问题有影响)
如果有人想详细了解我是如何配置它的-这是我使用的教程:
教程中有一些 doubts/differences(例如 - 为什么最初在教程中 Web 应用程序是在 Docker 集线器上配置的,而实际上它使用的是 ACR。以及为什么要连接对于 ACR,本教程使用 Azure 资源管理器连接(而不是专用 Docker 容器 --> ACR 连接)以及为什么稍后在构建管道中为 dockerRegistryServiceConnection 设置了一些奇怪的 ID(我正在放弃我的 ACR docker 服务连接的这个地名)
但是整个构建管道都在工作。它正在将图像发布到 ACR。到这一步为止一切正常。
当我想使用此图像发布 Azure WebApp 时,问题就出现了。问题在于... TAGS :) 它们不匹配。我有自动 CI/CD - 所以当我将一些更改推送到 repo 时,我看到发布管道正在工作。它正在 ACR 中创建图像。然后我看到,那个发布管道是 运行。一切都是 "correct" - 意味着没有看到错误并且版本是绿色的。
但是当我转到应用程序服务和容器设置时,我从日志中看到:
2020-04-21 18:02:28.321 INFO - Pulling image: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
2020-04-21 18:02:28.761 ERROR - DockerApiException: Docker API responded with status code=NotFound, response={"message":"manifest for myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a not found: manifest unknown: manifest unknown"}
2020-04-21 18:02:28.761 ERROR - Pulling docker image myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a failed:
2020-04-21 18:02:28.762 INFO - Pulling image from Docker hub: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
2020-04-21 18:02:28.867 ERROR - DockerApiException: Docker API responded with status code=InternalServerError, response={"message":"Get https://myAcrName.azurecr.io/v2/mobile/signalr/manifests/c7aead0c46b66afc4131935efc7e6a51280dfb1a: unauthorized: authentication required"}
2020-04-21 18:02:28.870 ERROR - Image pull failed: Verify docker image configuration and credentials (if using private repository)
非常复杂的错误,但根本原因是,他试图获取带有不存在标签的图像,即 GIT COMMIT 标签。它假设通过 $(Build.BuildId) (这是我的第一次尝试)或 $(Build.BuilNumber) (这是我的第二次尝试)
获取图像
管道步骤(部署 Azure 应用服务)如下所示:
- task: AzureRmWebAppDeployment@4
displayName: 'Deploy Azure App Service'
inputs:
azureSubscription: mySubcsriptionARM
appType: webAppContainer
WebAppName: myProductsignalr
DockerNamespace: myAcrName.azurecr.io
DockerRepository: mobile/signalr
DockerImageTag: '$(Build.BuildNumber)'
当我将管道日志作为 "Deploy Azure App Service" 日志发布时,我看到
2020-04-21T18:41:01.6012767Z ##[section]Starting: Deploy Azure App Service
2020-04-21T18:41:01.6367124Z ==============================================================================
2020-04-21T18:41:01.6367787Z Task : Azure App Service deploy
2020-04-21T18:41:01.6368381Z Description : Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby
2020-04-21T18:41:01.6368765Z Version : 4.163.5
2020-04-21T18:41:01.6369158Z Author : Microsoft Corporation
2020-04-21T18:41:01.6369603Z Help : https://aka.ms/azureappservicetroubleshooting
2020-04-21T18:41:01.6369976Z ==============================================================================
2020-04-21T18:41:03.8970184Z Got service connection details for Azure App Service:'myProductsignalr'
2020-04-21T18:41:04.5534864Z Trying to update App Service Configuration settings. Data: {"appCommandLine":null,"linuxFxVersion":"DOCKER|myAcrName.azurecr.io/mobile/signalr:1f283100"}
2020-04-21T18:41:05.5465725Z Updated App Service Configuration settings.
2020-04-21T18:41:05.5495890Z Trying to update App Service Application settings. Data: {"DOCKER_CUSTOM_IMAGE_NAME":"myAcrName.azurecr.io/mobile/signalr:1f283100"}
2020-04-21T18:41:06.2703349Z Updated App Service Application settings and Kudu Application settings.
2020-04-21T18:41:32.4715682Z Updated App Service Application settings and Kudu Application settings.
2020-04-21T18:41:33.4179962Z Successfully updated deployment History at https://myProductsignalr.scm.azurewebsites.net/api/deployments/111587494492765
2020-04-21T18:41:33.5945654Z App Service Application URL: http://myProductsignalr.azurewebsites.net
2020-04-21T18:41:33.6180118Z ##[section]Finishing: Deploy Azure App Service
令我惊讶的是,它显示一切正常 - 当它远离 "ok" :)
当我进入容器设置时:
a) 新代码发布
b) 建立管道火灾
c) 释放管道火灾
我是这样看的:
标签为空。如果我手动选择一些标签:
并且会选择:"SAVE"一切正常(SingalR 已启动并且 运行 正确)
很明显,我漏掉了什么:/ 帮我看看是什么;)
对我来说根本原因是这个片段:
DockerImageTag: '$(Build.BuildNumber)'
应该插入内部版本号(如上所述)并且来自容器设置的信息应该是:
Pulling image: myAcrName.azurecr.io/mobile/signalr:20200421.09
(对于 BuildNumber 20200421.09),它正在插入 GIT COMMIT 作为标记并以:Pulling image: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
Why o why?:)
[更新 22.04 10:56]
我正在发布我当前正在使用的构建管道。我认为它不重要,因为它工作正常,问题更多在于部署正确创建的 docker 图像(在 ACR 上),而不是通过构建管道创建此图像。不过,这是管道:
# Docker
# Build a Docker image
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker
trigger:
- master
resources:
- repo: self
variables:
dockerRegistryServiceConnection: 'MyProductDockerACR'
imageRepository: 'mobile/signalr'
containerRegistry: 'myAcrName.azurecr.io'
dockerfilePath: '**/Dockerfile'
tag: '$(Build.BuildNumber)'
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 and push image to container registry
inputs:
containerRegistry: $(dockerRegistryServiceConnection)
repository: $(imageRepository)
command: 'buildAndPush'
Dockerfile: $(dockerfilePath)
tags: |
$(tag)
是的。你是对的。您的标签不匹配。
在Docker@2
任务中你可以定义标签:
steps:
- task: Docker@2
displayName: Login to ACR
inputs:
command: login
containerRegistry: devopsmanual-acr
- task: Docker@2
displayName: Build and Push
inputs:
repository: $(imageName)
command: buildAndPush
Dockerfile: build-docker-image/SampleAppForDocker/DOCKERFILE
tags: |
$(Build.BuildNumber)
- task: Docker@2
displayName: Logout of ACR
inputs:
command: logout
containerRegistry: devopsmanual-acr
你的定义应该和这个差不多。 devopsmanual-acr
连接到您的 ACR。
。
我最近对在 Azure DevOps 上创建 docker 图像很生气 a blog post 所以也许这对你也有帮助。
如果这不足以解决您的问题,请编辑您的问题并展示您如何创建和推送图像。
我看到您使用的版本是由 UI
配置的。它的工作逻辑与YAML
配置的大不相同。
其实这里你收到的只是运行发布原因不同而产生的不同性能。
我猜这个版本有针对 Repos 的工件源,对吧?您可以通过检查其图标来确认。
虽然发布源来自 Repos,但 Build.BuildNumber
将是 commit id
(8 个字符)的短部分。 Build.BuildId 是完整的提交 ID。
如果你希望版本继续使用相应构建(created/pushed image)使用的Build.Buildnumber
值,你必须确保版本源是针对此构建。此外,此构建需求生成了工件。根据您分享的 YAML,显然,您还没有这样做。
只有由构建和工件触发的发布,然后Build.BuildNumber
可以像构建正在使用的20200422.1
。
因此,请转到您的发布定义,并重新配置其来源以确保它来自 构建工件 而不是存储库。
我有一个非常奇怪(而且我想很容易解决)的问题 :) 我正在尝试在 Azure 中建立一个有效的 CI/CD 管道。为此,我在 Azure devops 中创建了一个存储库,并创建了构建和发布管道。我正在将 docker 图像发布到 Azure 容器注册表,并且在发布期间,我正在拉取此图像(或者至少 - 我正在尝试,因为它不起作用)并且我正在尝试将其发布到容器的 Webapp 上。在我的例子中,"app" 是 .NET Core 3.1 上的 SingalR 集线器(但我不认为它对我遇到的问题有影响)
如果有人想详细了解我是如何配置它的-这是我使用的教程:
教程中有一些 doubts/differences(例如 - 为什么最初在教程中 Web 应用程序是在 Docker 集线器上配置的,而实际上它使用的是 ACR。以及为什么要连接对于 ACR,本教程使用 Azure 资源管理器连接(而不是专用 Docker 容器 --> ACR 连接)以及为什么稍后在构建管道中为 dockerRegistryServiceConnection 设置了一些奇怪的 ID(我正在放弃我的 ACR docker 服务连接的这个地名)
但是整个构建管道都在工作。它正在将图像发布到 ACR。到这一步为止一切正常。
当我想使用此图像发布 Azure WebApp 时,问题就出现了。问题在于... TAGS :) 它们不匹配。我有自动 CI/CD - 所以当我将一些更改推送到 repo 时,我看到发布管道正在工作。它正在 ACR 中创建图像。然后我看到,那个发布管道是 运行。一切都是 "correct" - 意味着没有看到错误并且版本是绿色的。
但是当我转到应用程序服务和容器设置时,我从日志中看到:
2020-04-21 18:02:28.321 INFO - Pulling image: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
2020-04-21 18:02:28.761 ERROR - DockerApiException: Docker API responded with status code=NotFound, response={"message":"manifest for myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a not found: manifest unknown: manifest unknown"}
2020-04-21 18:02:28.761 ERROR - Pulling docker image myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a failed:
2020-04-21 18:02:28.762 INFO - Pulling image from Docker hub: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
2020-04-21 18:02:28.867 ERROR - DockerApiException: Docker API responded with status code=InternalServerError, response={"message":"Get https://myAcrName.azurecr.io/v2/mobile/signalr/manifests/c7aead0c46b66afc4131935efc7e6a51280dfb1a: unauthorized: authentication required"}
2020-04-21 18:02:28.870 ERROR - Image pull failed: Verify docker image configuration and credentials (if using private repository)
非常复杂的错误,但根本原因是,他试图获取带有不存在标签的图像,即 GIT COMMIT 标签。它假设通过 $(Build.BuildId) (这是我的第一次尝试)或 $(Build.BuilNumber) (这是我的第二次尝试)
获取图像管道步骤(部署 Azure 应用服务)如下所示:
- task: AzureRmWebAppDeployment@4
displayName: 'Deploy Azure App Service'
inputs:
azureSubscription: mySubcsriptionARM
appType: webAppContainer
WebAppName: myProductsignalr
DockerNamespace: myAcrName.azurecr.io
DockerRepository: mobile/signalr
DockerImageTag: '$(Build.BuildNumber)'
当我将管道日志作为 "Deploy Azure App Service" 日志发布时,我看到
2020-04-21T18:41:01.6012767Z ##[section]Starting: Deploy Azure App Service
2020-04-21T18:41:01.6367124Z ==============================================================================
2020-04-21T18:41:01.6367787Z Task : Azure App Service deploy
2020-04-21T18:41:01.6368381Z Description : Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby
2020-04-21T18:41:01.6368765Z Version : 4.163.5
2020-04-21T18:41:01.6369158Z Author : Microsoft Corporation
2020-04-21T18:41:01.6369603Z Help : https://aka.ms/azureappservicetroubleshooting
2020-04-21T18:41:01.6369976Z ==============================================================================
2020-04-21T18:41:03.8970184Z Got service connection details for Azure App Service:'myProductsignalr'
2020-04-21T18:41:04.5534864Z Trying to update App Service Configuration settings. Data: {"appCommandLine":null,"linuxFxVersion":"DOCKER|myAcrName.azurecr.io/mobile/signalr:1f283100"}
2020-04-21T18:41:05.5465725Z Updated App Service Configuration settings.
2020-04-21T18:41:05.5495890Z Trying to update App Service Application settings. Data: {"DOCKER_CUSTOM_IMAGE_NAME":"myAcrName.azurecr.io/mobile/signalr:1f283100"}
2020-04-21T18:41:06.2703349Z Updated App Service Application settings and Kudu Application settings.
2020-04-21T18:41:32.4715682Z Updated App Service Application settings and Kudu Application settings.
2020-04-21T18:41:33.4179962Z Successfully updated deployment History at https://myProductsignalr.scm.azurewebsites.net/api/deployments/111587494492765
2020-04-21T18:41:33.5945654Z App Service Application URL: http://myProductsignalr.azurewebsites.net
2020-04-21T18:41:33.6180118Z ##[section]Finishing: Deploy Azure App Service
令我惊讶的是,它显示一切正常 - 当它远离 "ok" :)
当我进入容器设置时: a) 新代码发布 b) 建立管道火灾 c) 释放管道火灾
我是这样看的:
标签为空。如果我手动选择一些标签:
并且会选择:"SAVE"一切正常(SingalR 已启动并且 运行 正确)
很明显,我漏掉了什么:/ 帮我看看是什么;)
对我来说根本原因是这个片段:
DockerImageTag: '$(Build.BuildNumber)'
应该插入内部版本号(如上所述)并且来自容器设置的信息应该是:
Pulling image: myAcrName.azurecr.io/mobile/signalr:20200421.09
(对于 BuildNumber 20200421.09),它正在插入 GIT COMMIT 作为标记并以:Pulling image: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
Why o why?:)
[更新 22.04 10:56]
我正在发布我当前正在使用的构建管道。我认为它不重要,因为它工作正常,问题更多在于部署正确创建的 docker 图像(在 ACR 上),而不是通过构建管道创建此图像。不过,这是管道:
# Docker
# Build a Docker image
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker
trigger:
- master
resources:
- repo: self
variables:
dockerRegistryServiceConnection: 'MyProductDockerACR'
imageRepository: 'mobile/signalr'
containerRegistry: 'myAcrName.azurecr.io'
dockerfilePath: '**/Dockerfile'
tag: '$(Build.BuildNumber)'
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 and push image to container registry
inputs:
containerRegistry: $(dockerRegistryServiceConnection)
repository: $(imageRepository)
command: 'buildAndPush'
Dockerfile: $(dockerfilePath)
tags: |
$(tag)
是的。你是对的。您的标签不匹配。
在Docker@2
任务中你可以定义标签:
steps:
- task: Docker@2
displayName: Login to ACR
inputs:
command: login
containerRegistry: devopsmanual-acr
- task: Docker@2
displayName: Build and Push
inputs:
repository: $(imageName)
command: buildAndPush
Dockerfile: build-docker-image/SampleAppForDocker/DOCKERFILE
tags: |
$(Build.BuildNumber)
- task: Docker@2
displayName: Logout of ACR
inputs:
command: logout
containerRegistry: devopsmanual-acr
你的定义应该和这个差不多。 devopsmanual-acr
连接到您的 ACR。
我最近对在 Azure DevOps 上创建 docker 图像很生气 a blog post 所以也许这对你也有帮助。
如果这不足以解决您的问题,请编辑您的问题并展示您如何创建和推送图像。
我看到您使用的版本是由 UI
配置的。它的工作逻辑与YAML
配置的大不相同。
其实这里你收到的只是运行发布原因不同而产生的不同性能。
我猜这个版本有针对 Repos 的工件源,对吧?您可以通过检查其图标来确认。
虽然发布源来自 Repos,但 Build.BuildNumber
将是 commit id
(8 个字符)的短部分。 Build.BuildId 是完整的提交 ID。
如果你希望版本继续使用相应构建(created/pushed image)使用的Build.Buildnumber
值,你必须确保版本源是针对此构建。此外,此构建需求生成了工件。根据您分享的 YAML,显然,您还没有这样做。
只有由构建和工件触发的发布,然后Build.BuildNumber
可以像构建正在使用的20200422.1
。
因此,请转到您的发布定义,并重新配置其来源以确保它来自 构建工件 而不是存储库。