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
相关产品推荐
相关产品推荐

