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

在Jenkins中使用ECR作为Docker构建缓存后端的报错排查

Jenkins流水线用ECR做远程缓存时提示builder不存在的问题

背景

在Jenkins上搭了构建Docker镜像的CI流水线,因为代理是临时实例,想靠ECR远程缓存提高缓存命中率。已经按要求创建了用docker-container驱动的自定义Docker Builder(默认驱动不支持ECR缓存),docker buildx ls能看到builder已经在运行,但执行docker.build()时却报错。

当前代码实现

dockerBuilder = 'ecr-caching-builder'

pipeline {
  // ...
  stages {
    // ...
    stage('...') {
      steps {
        script {
          // 不存在则创建docker builder
          sh """
            docker buildx inspect ${dockerBuilder} || \
              docker buildx create \
                --driver=docker-container \
                --name=${dockerBuilder}
          """

          // 确认builder存在
          sh 'docker buildx ls'

          // 构建的镜像从ECR拉取基础镜像
          docker.withRegistry("https://${ECR_REGISTRY}", "ecr:${REGION}:${ECR_SECRET_ID}") {

            // 参考AWS文档构建镜像
            docker.build("${DOCKER_IMAGE_NAME}_${BRANCH_NAME}_${env.BUILD_NUMBER}",
             "--builder ${dockerBuilder} \
              --cache-to mode=max,image-manifest=true,oci-mediatypes=true,type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \
              --cache-from type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \
              ."
            )
          }
        }
      }
    }
  }
}

报错信息

ERROR: no builder "ecr-caching-builder" found

解决办法

  • 激活创建的builder:docker buildx create创建后不会自动激活,需要加上--use参数,或者单独执行激活命令。修改创建脚本:

    docker buildx inspect ${dockerBuilder} || \
      docker buildx create \
        --driver=docker-container \
        --name=${dockerBuilder} \
        --use
    

    或者在script块里单独加一行:

    sh "docker buildx use ${dockerBuilder}"
    
  • 验证builder运行状态:创建后执行docker buildx inspect ${dockerBuilder}确认builder处于运行状态,若未运行,执行启动命令:

    docker buildx inspect ${dockerBuilder} --bootstrap
    
  • 改用docker buildx build直接执行:Jenkins的docker.build()方法对buildx参数支持有限,换成直接调用shell命令的方式更可靠:

    sh """
    docker buildx build \
      --builder ${dockerBuilder} \
      --cache-to mode=max,image-manifest=true,oci-mediatypes=true,type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \
      --cache-from type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \
      -t ${DOCKER_IMAGE_NAME}_${BRANCH_NAME}_${env.BUILD_NUMBER} \
      .
    """
    

    注:如果需要推送到ECR,要先通过Jenkins的ECR凭证插件生成并执行登录命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:35:55