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

GitLab CI/CD推送Docker镜像至Docker Hub失败求助

问题分析与解决方案

核心问题原因

GitLab CI的每个Job(对应流水线的各个阶段)运行在独立的隔离环境中,build-docker-image阶段构建的Docker镜像仅存在于该Job的Docker-in-Docker(DinD)环境内,push-image-to-docker-hub阶段的Job是全新的容器环境,无法直接访问前一阶段构建的镜像,因此报错“本地不存在对应tag的镜像”。

解决方案

方案一:合并构建与推送步骤(推荐)

将镜像构建和推送逻辑合并到同一个Job中,确保在同一个Docker环境内完成所有操作,避免跨Job的环境隔离问题。修改后的.gitlab-ci.yml配置如下:

image: maven:latest
stages:
  - build
  - build-and-push-docker-image

build-java-project:
  stage: build
  script:
    - "mvn package"
  artifacts:
    paths:
      - target/

build-and-push-docker-image:
  stage: build-and-push-docker-image
  before_script:
    # 注意:确保GitLab项目CI/CD变量中已设置DOCKER_HUB_USER和DOCKER_HUB_PASSWORD
    - docker login -u "$DOCKER_HUB_USER" -p "$DOCKER_HUB_PASSWORD"
  script:
    - docker info
    - ls -l target/
    - docker build -t rajvis962/demo:latest .
    - docker push rajvis962/demo:latest
  image: docker:stable
  services:
    - docker:dind

方案二:通过Artifacts传递镜像

在构建阶段将镜像导出为tar包作为Artifacts上传,推送阶段再加载该tar包完成推送:

  1. 修改build-docker-image阶段配置,添加镜像导出和Artifacts设置:
build-docker-image:
  stage: build-docker-image
  script:
    - docker info
    - ls -l target/
    - docker build -t rajvis962/demo:latest .
    - docker save -o demo-image.tar rajvis962/demo:latest
  image: docker:stable
  services:
    - docker:dind
  artifacts:
    paths:
      - demo-image.tar
  1. 修改push-image-to-docker-hub阶段配置,加载tar包后推送:
Push Docker Image to DockerHub:
  stage: push-image-to-docker-hub
  before_script:
    - docker login -u "$DOCKER_HUB_USER" -p "$DOCKER_HUB_PASSWORD"
  script:
    - docker info
    - docker load -i demo-image.tar
    - docker push rajvis962/demo:latest
  image: docker:stable
  services:
    - docker:dind

额外注意事项

  • 仓库名称匹配:你提到Docker Hub已有仓库helloworld,但当前镜像tag为rajvis962/demo,需确保Docker Hub上存在demo仓库,或者将镜像tag改为rajvis962/helloworld:latest,否则推送会因仓库不存在失败。
  • CI变量正确性:避免使用$CI_REGISTRY_USER/$CI_REGISTRY_PASSWORD(这两个变量默认对应GitLab自身的容器注册表),建议手动设置DOCKER_HUB_USER(你的Docker Hub账号rajvis962)和DOCKER_HUB_PASSWORD(Docker Hub密码或访问令牌)作为项目CI/CD变量。
  • 本地环境与CI环境隔离:本地执行docker images看不到CI中构建的镜像属于正常现象,因为CI运行在GitLab Runner的独立环境中,与本地Docker环境无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:04:57