azure - 部署 ARM 模板和 Docker 映像
问题描述
好吧,每个人都在说要在这次大流行期间尝试学习新东西,所以这就是我正在尝试做的事情。我对 YAML 和 Docker 很陌生,对 ARM 模板也很陌生。
我已经能够使用 YAML 通过 dotnet YAML 命令构建和发布 .NET Core 应用程序。我已经能够使用 YAML 构建 .NET Core 3.1 Web API 应用程序的 Docker 映像。
我将 docker 映像发布到 Azure 资源容器。
我被困在哪里:
理想情况下,我想在 .NET Core 项目中使用 ARM 模板,以便能够通过代码部署我的 Azure 门户资源,而不是在门户中手动创建。这应该包括 Azure 资源容器。
看来我需要做的是在构建阶段构建 docker 映像,然后将其发布到 $(System.ArtifactsDirectory) 以便我可以将其保留在那里,直到通过 ARM 模板部署 Azure 资源。
不过,我找不到任何关于将 docker 映像发布为管道工件的信息。只有关于推送到 DockerHub、GitHub 和 Azure 资源容器的事情,这不是我现在想做的事情。
任何人有任何想法我怎么能做到这一点?
解决方案
我实际上找到了一种方法来解决这个问题。我在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 模板工作,然后我将确保 docker 图像推送到 ACR。如果您要从头开始重建环境,只需注释掉 ARM 模板步骤之后的部署步骤即可部署基础架构,然后取消注释其余步骤。这不是最干净的解决方案,但我更喜欢它而不是仅仅为了部署基础设施而使用单独的管道。
推荐阅读
- c - 编译器如何区分 int 和 char 指针?
- c# - 如何在 Visual Studio 2019 中更改此特定颜色?
- python - 是否有可能在指定的时间后消失的输出?
- arrays - 获取数组中每个字符串最后一次出现的索引
- python - 将一个列表的元素插入到python中不同位置的另一个列表中
- javascript - 无法访问 Vue JS 3 中的子对象
- java - 如何让 Firebase 告诉我用户崩溃的确切代码行?
- java - Java 转换为 base 7
- flutter - 计数器应用程序之外的简单 Riverpod 示例:两个单元格的总和
- java - 使用 button.getTag().toString() 会导致应用程序崩溃