You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps中如何在多个Job间共享buildx builder?

问题分析

Azure DevOps中每个Job都运行在独立的Agent虚拟机实例上,你在setup Job中创建的multiarchBuilder仅存在于该Agent的Docker上下文环境中,后续的服务构建Job会在全新的Agent实例上启动,自然无法找到已创建的builder,这就是报错ERROR: no builder "multiarchBuilder" found的根本原因。

解决方案:使用Docker-in-Docker(DinD)共享Docker环境

通过配置服务容器让所有Job共享同一个Docker守护进程,这样setup Job创建的buildx builder就能被所有后续Job复用,同时完全保留独立服务Job的结构,满足清晰性和扩展性需求。

调整后的Pipeline配置

name: build-docker-images

trigger: none

pool:
  vmImage: 'ubuntu-latest'
  # 配置DinD服务容器,所有Job共享同一Docker守护进程
  container:
    image: mcr.microsoft.com/azure-pipelines/vsts-agent:ubuntu-20.04-docker-20.10.14
    options: >
      --privileged
      -v /var/run/docker.sock:/var/run/docker.sock

variables:
  - template: globals.yml

jobs:
  - job: setup
    displayName: 'Setup'
    steps:
      - checkout: self
        persistCredentials: true

      - pwsh: |
          docker run --rm --privileged tonistiigi/binfmt --install all
        displayName: "Install QEMU emulators"

      - pwsh: |
          docker buildx create --name multiarchBuilder --driver=docker-container --driver-opt image=moby/buildkit:latest
          # 设置为默认builder,后续构建命令无需手动指定--builder参数
          docker buildx use multiarchBuilder
        displayName: "Create and set default buildx builder"

  - job: build_obfuscated_service_docker_image
    dependsOn: setup
    displayName: 'Build obfuscated_service docker image'
    steps:
      - pwsh: |
          docker buildx bake -f ./docker/docker-compose.yml --set "*.context=." --set "obfuscated_service.tags=docker_obfuscated_service:latest" --load obfuscated_service

  - job: build_obfuscated_service_2_docker_image
    dependsOn: setup
    displayName: 'Build obfuscated_service_2 docker image'
    steps:
      - pwsh: |
          docker buildx bake -f ./docker/docker-compose.yml --set "*.context=." --set "obfuscated_service_2.tags=docker_obfuscated_service_2:latest" --load obfuscated_service_2 

    ...[more jobs for more services]

关键细节说明

  • 共享Docker环境:使用微软官方的预装Docker的Agent镜像,加上--privileged参数启用DinD模式,所有Job都会连接到同一个Docker守护进程,builder状态自然全局共享。
  • 默认builder设置:在setup Job中添加docker buildx use multiarchBuilder,后续的buildx bake命令无需手动指定--builder参数,避免重复配置。
  • 保留独立Job结构:每个服务的构建Job依然保持独立,互不干扰,完全满足扩展性和清晰性要求。
备选方案:导出/导入Buildx Builder配置

如果无法使用特权容器(DinD需要特权权限),可以通过导出builder配置文件的方式实现跨Job共享:

修改Setup Job,导出builder配置

- pwsh: |
    docker buildx create --name multiarchBuilder --driver=docker-container --driver-opt image=moby/buildkit:latest
    # 导出builder配置到文件
    docker buildx inspect multiarchBuilder --bootstrap > builder-config.json
  displayName: "Create builder and export config"

- publish: $(System.DefaultWorkingDirectory)/builder-config.json
  artifact: builder-config

修改服务Job,导入builder配置

steps:
  - download: current
    artifact: builder-config

  - pwsh: |
      # 导入builder配置
      docker buildx create --name multiarchBuilder --file $(Pipeline.Workspace)/builder-config/builder-config.json
      docker buildx use multiarchBuilder
    displayName: "Import shared buildx builder"

  # 后续构建命令保持不变

备选方案说明

  • 此方法无需依赖特权容器,但每个服务Job需要额外的导入步骤,适合权限受限的场景。
  • 注意:buildx builder的远程连接信息可能会过期,需确保导出和导入的操作在同一Pipeline周期内完成。

内容的提问来源于stack exchange,提问作者toni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:07:50