如何设置 Azure Pipelines 以使用多个 docker 容器发布到 Azure App Service?
How do I setup Azure Pipelines to release to Azure App Service with multiple docker containers?
我正处于开发项目的早期阶段 -- 并试图确定 CI/CD 管道。在尝试将多个 docker 容器部署到单个 Azure 应用服务中时,我 运行 陷入了一些困惑。这是我要实现的目标的概述,其中包含尽可能多的细节。任何关于我哪里出错的指导将不胜感激。我在项目旁边打了勾
相信我已经正确配置了
- 将代码合并到 Github 存储库的主分支✔
- 自动触发 Azure DevOps 管道✔
- 通过 运行 docker-compose.yml 文件(该文件由 Visual Studio 自动生成)构建我的所有服务,用当前构建 ID 标记它们
- 将所有图像推送到我的 azure 容器注册表
- 将我的 docker-compose.yml 复制到工件暂存文件夹
- 发布神器升级文件夹
- 实现的YML:
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: DockerCompose@0
inputs:
containerregistrytype: 'Azure Container Registry'
azureSubscription: 'MYSUB'
azureContainerRegistry: 'MYACR'
dockerComposeFile: '**/docker-compose.yml'
action: 'Build services'
additionalImageTags: $(Build.BuildId)
- task: DockerCompose@0
inputs:
containerregistrytype: 'Azure Container Registry'
azureSubscription: 'MYSUB'
azureContainerRegistry: 'MYACR'
dockerComposeFile: '**/docker-compose.yml'
action: 'Push services'
includeSourceTags: true
includeLatestTag: true
additionalImageTags: $(Build.BuildId)
- task: CopyFiles@2
inputs:
Contents: '**/docker-compose.yml'
TargetFolder: '$(Build.ArtifactStagingDirectory)'
OverWrite: true
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- docker-compose.yml(通用名称)
version: '3.4'
services:
service1:
image: ${DOCKER_REGISTRY-}service1
build:
context: .
dockerfile: src/PROJECTNAMEHERE/Dockerfile
api1:
image: ${DOCKER_REGISTRY-}api1
build:
context: .
dockerfile: src/PROJECTNAMEHERE/Dockerfile
service2:
image: ${DOCKER_REGISTRY-}service2
build:
context: .
dockerfile: src/PROJECTNAMEHERE/Dockerfile
- 拥有一个包含多个阶段的 Azure DevOps 发布管道,用于发布到 QA/Prod 环境 ❌
- 添加要在 Release Creation 中设置的变量,我正在寻找目标
- Add the artifact from above
- 有 2 个阶段,QA 和 Prod
- 每个阶段只运行一个 "Azure Web App on Container Deploy" 任务
- 我设置 "Image name" 等于我的 3 个服务来自 ACR
myacrrepo.azurecr.io/service1:$(BuildId)
myacrrepo.azurecr.io/api1:$(BuildId)
myacrrepo.azurecr.io/service2:$(BuildId)
- 我将"Configuration File"设置为神器中的docker-compose.yml
$(System.DefaultWorkingDirectory)/_david#####.#####/drop/docker-compose.yml
- 这一步的 YML
steps:
- task: AzureWebAppContainer@1
displayName: 'Azure Web App on Container Deploy'
inputs:
azureSubscription: 'MYSUB'
appName: myapname
containers: |
myacrrepo.azurecr.io/service1:$(BuildId)
myacrrepo.azurecr.io/api1:$(BuildId)
myacrrepo.azurecr.io/service2:$(BuildId)
multicontainerConfigFile: '$(System.DefaultWorkingDirectory)/_david#####.#####/drop/docker-compose.yml'
当一切都说完了,这个发布管道开始运行——我的应用服务最终被配置为从 Docker Hub 抓取它的图像——容器图像无法拉取,因为没有docker 集线器凭据已填写,我的 docker-compose.yml 文件中的图像名称无效(例如,“${DOCKER_REGISTRY-}api1”)
我以前从未使用过 docker,所以我正在努力正确地解决这个问题。我已尝试包含尽可能多的信息,如果您还需要其他信息,请告诉我 - 再次感谢您的帮助。
据我所知,Azure Web App 不支持在docker-compose 文件中使用自定义变量,只能在docker-compose 文件中使用支持选项。你可以看到 support options. So you need to use the image
option without build
and set the image with the real image name such as myacrrepo.azurecr.io/service1:tag
. When you use the Azure Container Registry, it's a private registry, so you need to set the credential of the ACR in the appSettings. See the environment variables for ACR.
所以容器任务的网络应用在 YAML 文件中应该是这样的:
steps:
- task: AzureWebAppContainer@1
displayName: Azure Web App on Container Deploy
inputs:
appName: myapname
azureSubscription: $(azureSubscription)
appSettings:
-DOCKER_REGISTRY_SERVER_USERNAME myacrrepo
-DOCKER_REGISTRY_SERVER_URL myacrrepo.azurecr.io
-DOCKER_REGISTRY_SERVER_PASSWORD xxxxxxxx
multicontainerConfigFile: $(System.DefaultWorkingDirectory)/docker-compose.yaml
我正处于开发项目的早期阶段 -- 并试图确定 CI/CD 管道。在尝试将多个 docker 容器部署到单个 Azure 应用服务中时,我 运行 陷入了一些困惑。这是我要实现的目标的概述,其中包含尽可能多的细节。任何关于我哪里出错的指导将不胜感激。我在项目旁边打了勾 相信我已经正确配置了
- 将代码合并到 Github 存储库的主分支✔
- 自动触发 Azure DevOps 管道✔
- 通过 运行 docker-compose.yml 文件(该文件由 Visual Studio 自动生成)构建我的所有服务,用当前构建 ID 标记它们
- 将所有图像推送到我的 azure 容器注册表
- 将我的 docker-compose.yml 复制到工件暂存文件夹
- 发布神器升级文件夹
- 实现的YML:
trigger: - main pool: vmImage: 'ubuntu-latest' steps: - task: DockerCompose@0 inputs: containerregistrytype: 'Azure Container Registry' azureSubscription: 'MYSUB' azureContainerRegistry: 'MYACR' dockerComposeFile: '**/docker-compose.yml' action: 'Build services' additionalImageTags: $(Build.BuildId) - task: DockerCompose@0 inputs: containerregistrytype: 'Azure Container Registry' azureSubscription: 'MYSUB' azureContainerRegistry: 'MYACR' dockerComposeFile: '**/docker-compose.yml' action: 'Push services' includeSourceTags: true includeLatestTag: true additionalImageTags: $(Build.BuildId) - task: CopyFiles@2 inputs: Contents: '**/docker-compose.yml' TargetFolder: '$(Build.ArtifactStagingDirectory)' OverWrite: true - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
- docker-compose.yml(通用名称)
version: '3.4' services: service1: image: ${DOCKER_REGISTRY-}service1 build: context: . dockerfile: src/PROJECTNAMEHERE/Dockerfile api1: image: ${DOCKER_REGISTRY-}api1 build: context: . dockerfile: src/PROJECTNAMEHERE/Dockerfile service2: image: ${DOCKER_REGISTRY-}service2 build: context: . dockerfile: src/PROJECTNAMEHERE/Dockerfile
- 拥有一个包含多个阶段的 Azure DevOps 发布管道,用于发布到 QA/Prod 环境 ❌
- 添加要在 Release Creation 中设置的变量,我正在寻找目标
- Add the artifact from above
- 有 2 个阶段,QA 和 Prod
- 每个阶段只运行一个 "Azure Web App on Container Deploy" 任务
- 我设置 "Image name" 等于我的 3 个服务来自 ACR
myacrrepo.azurecr.io/service1:$(BuildId) myacrrepo.azurecr.io/api1:$(BuildId) myacrrepo.azurecr.io/service2:$(BuildId)
- 我将"Configuration File"设置为神器中的docker-compose.yml
$(System.DefaultWorkingDirectory)/_david#####.#####/drop/docker-compose.yml
- 这一步的 YML
steps: - task: AzureWebAppContainer@1 displayName: 'Azure Web App on Container Deploy' inputs: azureSubscription: 'MYSUB' appName: myapname containers: | myacrrepo.azurecr.io/service1:$(BuildId) myacrrepo.azurecr.io/api1:$(BuildId) myacrrepo.azurecr.io/service2:$(BuildId) multicontainerConfigFile: '$(System.DefaultWorkingDirectory)/_david#####.#####/drop/docker-compose.yml'
- 我设置 "Image name" 等于我的 3 个服务来自 ACR
当一切都说完了,这个发布管道开始运行——我的应用服务最终被配置为从 Docker Hub 抓取它的图像——容器图像无法拉取,因为没有docker 集线器凭据已填写,我的 docker-compose.yml 文件中的图像名称无效(例如,“${DOCKER_REGISTRY-}api1”)
我以前从未使用过 docker,所以我正在努力正确地解决这个问题。我已尝试包含尽可能多的信息,如果您还需要其他信息,请告诉我 - 再次感谢您的帮助。
据我所知,Azure Web App 不支持在docker-compose 文件中使用自定义变量,只能在docker-compose 文件中使用支持选项。你可以看到 support options. So you need to use the image
option without build
and set the image with the real image name such as myacrrepo.azurecr.io/service1:tag
. When you use the Azure Container Registry, it's a private registry, so you need to set the credential of the ACR in the appSettings. See the environment variables for ACR.
所以容器任务的网络应用在 YAML 文件中应该是这样的:
steps:
- task: AzureWebAppContainer@1
displayName: Azure Web App on Container Deploy
inputs:
appName: myapname
azureSubscription: $(azureSubscription)
appSettings:
-DOCKER_REGISTRY_SERVER_USERNAME myacrrepo
-DOCKER_REGISTRY_SERVER_URL myacrrepo.azurecr.io
-DOCKER_REGISTRY_SERVER_PASSWORD xxxxxxxx
multicontainerConfigFile: $(System.DefaultWorkingDirectory)/docker-compose.yaml