如何设置 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 应用服务中时,我 运行 陷入了一些困惑。这是我要实现的目标的概述,其中包含尽可能多的细节。任何关于我哪里出错的指导将不胜感激。我在项目旁边打了勾 相信我已经正确配置了

  1. 将代码合并到 Github 存储库的主分支✔
  2. 自动触发 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
      
  3. 拥有一个包含多个阶段的 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