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

Bitbucket Pipelines多步骤中Docker镜像无法跨步骤访问求助

Bitbucket Pipelines: Docker Image Not Found in Subsequent Step

我来帮你解决这个问题——你遇到的核心问题是Bitbucket Pipelines的每个步骤都是独立运行的Docker容器,步骤3里构建的镜像只存在于那个步骤的专属容器中,步骤4启动的是一个全新的容器,自然找不到之前的镜像。而你配置的artifacts: - ./**只会共享文件系统里的文件,Docker daemon里的镜像不在这个范围内,所以完全起不到作用。

下面给你两种可行的解决方案:

方案1:使用Bitbucket Docker缓存(推荐,高效)

Bitbucket Pipelines支持缓存Docker镜像,这样步骤4可以直接从缓存中拉取步骤3构建的镜像,不需要额外的文件传输。

修改后的Pipeline脚本:

image: atlassian/default-image:latest
options:
  docker: true
pipelines:
  branches:
    dev:
      - step:
          name: 1. Install dotnet
          script:
            # Do things
      - step:
          name: 2. Install AWS CLI
          script:
            # Do some more things
      - step:
          name: 3. Build Docker Image
          script:
            - export DOCKER_PROJECT_NAME=projectname
            - docker build -t $DOCKER_PROJECT_NAME:latest -t $DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER .
          caches:
            - docker  # 启用Docker缓存,保存构建的镜像
      - step:
          name: 4. Push Docker Image to AWS
          script:
            - export DOCKER_PROJECT_NAME=projectname
            - docker tag $DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER $AWS_REGISTRY_URL/$DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER
            - docker push $AWS_REGISTRY_URL/$DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER
          caches:
            - docker  # 从缓存加载镜像

说明:

  • caches: - docker会让Bitbucket把步骤3中Docker daemon里的镜像缓存起来,步骤4启动时会自动加载这个缓存,所以能找到之前构建的镜像。
  • 这个方法比文件传输高效得多,尤其适合镜像较大的场景。

方案2:将镜像导出为文件作为Artifact传递

如果缓存方案不适用(比如有特殊镜像清理需求),可以把步骤3的镜像导出为tar文件,作为artifact传给步骤4,再加载镜像。

修改后的脚本:

image: atlassian/default-image:latest
options:
  docker: true
pipelines:
  branches:
    dev:
      - step:
          name: 1. Install dotnet
          script:
            # Do things
      - step:
          name: 2. Install AWS CLI
          script:
            # Do some more things
      - step:
          name: 3. Build Docker Image
          script:
            - export DOCKER_PROJECT_NAME=projectname
            - docker build -t $DOCKER_PROJECT_NAME:latest -t $DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER .
            - docker save -o docker-image.tar $DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER  # 导出镜像为tar文件
          artifacts:
            - docker-image.tar  # 共享这个tar文件
      - step:
          name: 4. Push Docker Image to AWS
          script:
            - export DOCKER_PROJECT_NAME=projectname
            - docker load -i docker-image.tar  # 加载tar文件中的镜像
            - docker tag $DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER $AWS_REGISTRY_URL/$DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER
            - docker push $AWS_REGISTRY_URL/$DOCKER_PROJECT_NAME:v.$BITBUCKET_BUILD_NUMBER

说明:

  • docker save把镜像打包成tar文件,通过artifacts传递到步骤4。
  • docker load把tar文件重新导入到步骤4的Docker daemon中,之后就能正常tag和push了。
  • 注意如果镜像很大,这个方法会增加传输时间,不如缓存方案高效。

备选方案:合并步骤3和4

你已经提到合并步骤可以正常运行,如果拆分步骤的需求不是必须的,这也是最简单的解决方式——把构建和推送放在同一个步骤里,镜像自然就在同一个容器中,不需要额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:49