好吧,每个人都在说要在这种流行病中学习新的东西,所以这就是我要做的。我是YAML和Docker的新手,也是ARM模板的新手。
我已经能够使用dotnet YAML命令使用YAML来构建和发布.NET Core应用程序。我已经能够使用YAML来构建.NET Core 3.1 Web API应用程序的Docker映像。
我正在将docker映像发布到Azure资源容器。
我被困的地方:
理想情况下,我想在.NET Core项目中使用ARM模板,以便能够通过代码部署Azure门户资源,而不是在门户中手动创建。这应该包括Azure资源容器。
看来要完成此操作,我需要在构建阶段构建docker映像,然后将其发布到$(System.ArtifactsDirectory),以便可以将其保存在那里,直到已通过Azure部署Azure资源为止。 ARM模板。
我找不到有关将Docker映像作为管道工件发布的任何信息。只是有关推送到DockerHub,GitHub和Azure资源容器的事情,这不是我现在想做的。
任何人都知道如何将其实现吗?
答案 0 :(得分:0)
您将容器发布到Azure容器注册表。容器不是传统意义上的构件。
我怀疑您有鸡肉/鸡蛋问题。您想在部署过程中创建注册表,但是在构建过程中没有注册表。那么,如何将容器部署到直到下一个阶段才存在的注册表中,对吗?实际上,您会发现需要先为ACR创建服务连接,然后才能向其发布资源。 ARM模板将无法为您做到这一点。
在这种情况下,通常将应用程序的需求与较大的基础设施需求分开。 ACR是基础架构的支持部分。在这种情况下,通常有一个单独的管道来创建所需的支持基础结构来解决“鸡与蛋”问题。
另外,请注意正确的术语。没有什么叫做“ Azure资源容器”。有一种叫做“ Azure容器注册表”的东西,这就是我假设您在说的。
答案 1 :(得分:0)
我实际上找到了实现这一目标的方法。我读到的有关此文章的文章已在dev.to
上结束要实现这一目标,我需要做一些事情。
首先,不要在构建时设置containerRegistry。
- task: Docker@2
displayName: Build Docker Image
inputs:
repository: $(imageName)
command: build
dockerfile: '**/Dockerfile'
buildContext: 'HopefulMommaDesignsAPI'
tags: $(Build.BuildId)
之所以这样做是因为,如果您设置了容器注册表,则至少使用ACR,它将ACR URL前缀为docker映像名称。但是,在Azure DevOps中执行此操作时,该URL会被加密。没问题,但是在您列出图像时会引起混淆,因为它将显示为*** / ImageName。
第二,将图像另存为工件暂存目录中的TAR文件。
- task: Docker@2
displayName: 'Save image to TAR'
inputs:
repository: '$(imageName)'
command: save
arguments: '--output $(build.artifactstagingdirectory)/$(imageName).image.tar $(imageName):$(Build.BuildId)'
addPipelineData: false
发布版本时将包括.tar文件。
下一步是在部署作业期间。
下载构建工件并部署了ARM模板后,需要从.tar文件加载docker映像。
- task: Docker@2
displayName: 'Load Image from Tar'
inputs:
command: load
arguments: '--input $(build.artifactstagingdirectory)/$(buildArtifactName)/$(imageName).image.tar'
现在,已经加载了docker映像,您将需要对映像进行重新标记并发布。
- task: Docker@2
displayName: 'ReTag Image with ACR URL - BuildId'
inputs:
containerRegistry: 'Hopeful Momma Designs ACR'
repository: $(imageName)
command: tag
arguments: '$(imageName):$(Build.BuildId) $(containerRegistryUrl)/$(imageName):$(Build.BuildId)'
- task: Docker@2
displayName: 'ReTag Image with ACR URL - latest'
inputs:
containerRegistry: 'Hopeful Momma Designs ACR'
repository: $(imageName)
command: tag
arguments: '$(imageName):$(Build.BuildId) $(containerRegistryUrl)/$(imageName):latest'
- task: Docker@2
displayName: push
inputs:
containerRegistry: 'Hopeful Momma Designs ACR'
repository: $(imageName)
command: push
dockerfile: '**/Dockerfile'
buildContext: 'HopefulMommaDesignsAPI'
tags: |
$(Build.BuildId)
latest
注意::如果Azure容器注册表是ARM模板的一部分,则包含containerRegistry的Docker命令将失败,因为您必须手动设置从Azure DevOps到Azure的服务连接容器注册表之前,您可以在YAML文件中将其作为containerRegistry引用。
对我来说这不是什么大问题,因为无论如何我通常都会在部分管道中工作。我将确保构建工作正常,然后将确保ARM模板正常工作,然后将确保泊坞窗映像推送到ACR。如果要从头开始重建环境,只需在ARM模板步骤部署基础结构之后注释掉部署步骤,然后取消对其余步骤的注释即可。这不是最干净的解决方案,但我比拥有单独的管道来部署基础结构更好。