繁体   English   中英

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 上为容器发布它。 就我而言,“应用程序”是 .NET Core 3.1 上的 SingalR 集线器(但我认为它不会对我遇到的问题产生影响)

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

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

There were some doubts/differences in the tutorial (for example - why initially in the tutorial web app is being configured on Docker hub, when in fact it is using ACR. And why to connect to ACR the tutorial uses Azure Resource Manager connection (And不是专用的 Docker 容器 --> ACR 连接)为什么稍后在构建管道中为 dockerRegistryServiceConnection 设置了一些奇怪的 id(我在这个地名中给出了我的 ACR docker 服务连接的名称)

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

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

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

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

当我 go 将管道日志发布为“部署 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

在此处输入图像描述

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

当 i go 到容器设置之后:a)新代码发布 b)构建管道火灾 c)发布管道火灾

我是这样看的:

在此处输入图像描述

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

在此处输入图像描述

并会选择:“保存”一切正常(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为什么?)

[更新 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)

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

实际上,在这里您收到的只是发布的运行原因不同而产生的不同性能。

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

在此处输入图像描述

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

如果您希望发布继续使用相应构建(创建/推送的图像)正在使用的Build.Buildnumber值,则必须确保发布源针对此构建。 此外,此构建需要生成了工件。 根据您分享的 YAML,显然您没有这样做。

只有由构建触发的发布以及工件,然后Build.BuildNumber可以像构建正在使用的20200422.1

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

是的。 你说的对。 您的标签不匹配。

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 devopsmanual-acr连接到您的 ACR。

ACR 连接定义 .

我最近发了一篇关于在 Azure DevOps 上创建 docker 图像的博文,所以也许这对你也有帮助。

如果这不足以解决您的问题,请编辑您的问题并展示您如何创建和推送图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM