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

GitLab Runner构建Docker镜像后测试阶段无法找到镜像问题

问题原因

每个GitLab Runner的Docker executor Job都会启动独立的任务容器和对应的docker:dind服务容器。build阶段构建的镜像仅存在于该Job专属的docker:dind容器内部,test阶段是全新的Job,使用的是另一个独立的docker:dind容器,因此无法找到之前构建的镜像。另外,宿主机看不到该镜像,因为所有Docker操作都在docker:dind容器的独立Docker守护进程中执行,和宿主机的Docker环境完全隔离。

解决方案

方案1:合并构建与测试到单个Job

将build和test步骤放在同一个Job中,共享同一个docker:dind容器环境,镜像可直接复用:

image: docker:latest

variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_TLS_CERTDIR: ""

services:
  - name: docker:dind
    alias: docker

stages:
  - build-test

build-test:
  stage: build-test
  script:
    - docker build -t swim-web-img .
    - docker run -dp 8080:80 --name swim-web-cntr swim-web-img
    # 可在此添加测试验证命令,如curl http://localhost:8080
  tags:
    - docker
    - dotnet

方案2:用GitLab容器仓库中转镜像

把build阶段的镜像推送到项目专属的GitLab容器仓库,test阶段从仓库拉取使用:

修改build Job:

build:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE/swim-web-img:$CI_COMMIT_SHORT_SHA .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE/swim-web-img:$CI_COMMIT_SHORT_SHA
  tags:
    - docker
    - dotnet

修改test Job:

test:
  stage: test
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker pull $CI_REGISTRY_IMAGE/swim-web-img:$CI_COMMIT_SHORT_SHA
    - docker run -dp 8080:80 --name swim-web-cntr $CI_REGISTRY_IMAGE/swim-web-img:$CI_COMMIT_SHORT_SHA
  tags:
    - docker
    - dotnet

说明:$CI_REGISTRY_IMAGE、$CI_COMMIT_SHORT_SHA等均为GitLab内置预定义变量,无需手动配置,自动关联当前项目的容器仓库和提交哈希。

方案3:给docker:dind挂载宿主机存储(不推荐)

通过挂载宿主机的Docker存储目录,让多个Job共享同一个Docker环境,但会破坏Job的隔离性,仅适合测试环境临时使用:

image: docker:latest

variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_TLS_CERTDIR: ""

services:
  - name: docker:dind
    alias: docker
    volumes:
      - /var/lib/docker:/var/lib/docker

stages:
  - build
  - test

build:
  stage: build
  script:
    - docker build -t swim-web-img .
  tags:
    - docker
    - dotnet

test:
  stage: test
  script:
    - docker run -dp 8080:80 --name swim-web-cntr swim-web-img
  tags:
    - docker
    - dotnet

注意:需确保GitLab Runner有权限访问宿主机的/var/lib/docker目录,生产环境禁止使用此方案,避免不同Job的镜像相互干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:27:52