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

GitLab CI/CD中Docker Compose容器跨Job丢失,如何解决测试问题?

问题原因

GitLab CI的每个Job都运行在独立的执行环境中,docker-build阶段启动的容器仅存在于该Job对应的Runner容器里。当进入run-tests阶段时,会启动一个全新的Runner环境,自然找不到之前创建的容器——这就是容器消失的核心原因。

解决方案

方案1:合并构建与测试到同一个Job(最简单直接)

把构建和测试逻辑放在同一个Job中,避免环境切换导致的容器丢失:

variables:
  DOCKER_DRIVER: overlay2

image:
  name: docker:26.1.3

services:
  - docker:26.1.3-dind

before_script:
  - docker version
  - docker compose version

build-and-test:
  stage: test
  script:
    - docker compose down
    - docker compose up -d --build
    - docker compose exec app php vendor/bin/codecept run
    - docker compose down # 可选,测试完成后清理资源

方案2:通过CI工件传递镜像(适合必须分阶段的场景)

如果需要严格区分构建和测试阶段,可以在docker-build阶段把构建好的镜像导出为文件,作为CI工件传递到run-tests阶段,再重新加载启动容器:

variables:
  DOCKER_DRIVER: overlay2
  IMAGE_TAR: app-image.tar
  # 替换成你的docker-compose.yml中app服务对应的镜像名
  APP_IMAGE_NAME: your-app-image:latest

image:
  name: docker:26.1.3

services:
  - docker:26.1.3-dind

before_script:
  - docker version
  - docker compose version

docker-build:
  stage: build
  script:
    - docker compose build app
    - docker save -o $IMAGE_TAR $APP_IMAGE_NAME
  artifacts:
    paths:
      - $IMAGE_TAR
    expire_in: 1 hour # 按需设置工件过期时间

run-tests:
  stage: test
  dependencies:
    - docker-build # 关联构建阶段,获取工件
  script:
    - docker load -i $IMAGE_TAR
    - docker compose up -d app
    - docker compose exec app php vendor/bin/codecept run
    - docker compose down

方案3:使用专属Runner的共享卷(不推荐)

如果使用自己管理的专属Runner,可以配置Runner的共享卷,让多个Job共享Docker的存储目录。但这种方式会破坏Job的环境隔离性,容易出现资源冲突,仅适合单项目、低并发的场景,不推荐在公共Runner中使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:22:16