Azure Devops - 使用 docker 和 Azure 容器注册表 (ACR) 发布管道 - 标签问题

标签 azure docker azure-devops azure-pipelines-release-pipeline azure-container-registry

我有一个非常奇怪的(我想很容易解决)问题:)我正在尝试在 Azure 中建立一个有效的 CI/CD 管道。为此,我在 Azure DevOps 中创建了一个存储库,并创建了构建和发布管道。我正在将 docker 镜像发布到 Azure 容器注册表,在发布期间,我正在拉取此镜像(或者至少 - 我正在尝试,因为它不起作用),并且我正在尝试将其发布到容器的 Web 应用程序上。在我的例子中,“应用程序”是 .NET Core 3.1 上的 SingalR hub(但我不认为它对我遇到的问题有影响)

如果有人想详细了解我如何配置它 - 这是我使用的教程:

https://wikiazure.com/devops/azure-devops-automate-your-release-pipeline-to-provision-a-docker-container-to-azure-web-app-for-containers/

教程中存在一些疑问/差异(例如 - 为什么最初在教程中 Web 应用程序是在 Docker hub 上配置的,而实际上它正在使用 ACR。以及为什么教程使用 Azure 资源管理器连接到 ACR连接(而不是专用的 Docker 容器 --> ACR 连接)以及为什么后来在构建管道中为 dockerRegistryServiceConnection 设置了一些奇怪的 id(我在这个地方给出了我的 ACR docker 服务连接的名称)

但是整个构建管道正在运行。它正在将图像发布到 ACR。直到这一步一切都很好。

当我想使用此图像发布 Azure WebApp 时,问题就出现了。问题出在...标签:)它们不匹配。我有自动 CI/CD - 所以当我将一些更改推送到存储库时,我看到发布管道正在工作。它正在 ACR 中创建图像。然后我看到,发布管道正在运行。一切都是“正确的”——这意味着没有看到错误并且版本是绿色的。

但是当我转到应用程序服务和容器设置时,我从日志中看到:

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)'

当我将管道日志发布为“部署 Azure 应用服务”日志时,我看到

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

enter image description here

令我惊讶的是,它表明一切都很好 - 当它远离“ok”时:)

当我进入容器设置后: a) 发布新代码 b) build 管道火灾 c) 释放管道火灾

我是这样看的:

enter image description here

标签为空。如果我手动选择一些标签:

enter image description here

并且会选择:“保存”一切正常(SingalR 正常启动并运行)

显然,我错过了一些东西:/帮我看看是什么;)

对我来说根本原因是这个片段: DockerImageTag:'$(Build.BuildNumber)' 应插入内部版本号(如上所述),容器设置中的信息应为: 拉取图像:myAcrName.azurecr.io/mobile/signalr:20200421.09(对于 BuildNumber 20200421.09),它会在那里插入 GIT COMMIT 作为标签,并以:拉取图像:myAcrName.azurecr .io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a为什么为什么?:)

[更新 22.04 10:56]

我正在发布我当前正在使用的构建管道。我认为这并不重要,因为它工作正常,而且问题更多在于部署正确创建的 docker 镜像(在 ACR 上),而不是通过构建管道创建此镜像。尽管如此,这是管道:

# Docker
# Build a Docker image 
# https://learn.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)

最佳答案

我看到您正在使用的版本是由 UI 配置的。其工作逻辑与YAML配置的有很大不同。

事实上,这里您收到的只是版本运行原因不同而产生的不同性能。

我猜这个版本有针对Repos的工件源,对吧?您可以通过检查其图标进行确认。

enter image description here

虽然发布源来自 Repos,但是 Build.BuildNumber 将是 commit id 的短部分(8 个字符)。 Build.BuildId 是完整的提交 ID。

如果您希望版本继续使用相应构建(创建/推送的镜像)正在使用的 Build.BuildNumber 值,则必须确保版本源是瞄准此构建。此外,此构建需求还生成了工件。根据您共享的 YAML,显然您还没有这样做。

由构建与工件一起触发的发布,则 Build.BuildNumber 可以类似于构建所使用的 20200422.1

因此,请转到您的发布定义,并重新配置其源,以确保它来自构建工件而不是存储库。

关于Azure Devops - 使用 docker 和 Azure 容器注册表 (ACR) 发布管道 - 标签问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61354501/

相关文章:

java - 如何在 Tomcat 容器上运行 .jar?

git - 我可以同时从 VS 2015 连接到 VSTS 和 GitHub 吗?

c# - VssConnection 到 VSTS 总是提示输入凭据

azure - 从 Azure 搜索获取索引架构

database - Microsoft Azure 开发入门

python - 在运行时向 docker 镜像添加 pip 要求

tfs - 在 Mac 上更新到 Visual Studio 2019 后,与 Azure DevOps TFS 服务器的集成中断

c# - 如何正确连接MySQL数据库与C#应用程序?

c# - session 对象在 Azure 上变为 null

docker - 从 docker 容器中取出文件