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

GitLab CI/Docker Runner:如何为每个流水线获取干净容器?

GitLab Docker Runner容器复用问题解析与解决

一、默认行为解释

GitLab Docker Runner默认启用容器复用机制,核心目的是提升流水线执行效率——每次新建容器都要经历拉取镜像、初始化系统环境等耗时步骤,复用已创建的容器可以跳过这些环节,直接启动任务。

这种模式下,Runner不会在单个任务结束后立即销毁容器,而是将其标记为“闲置”状态。当有同标签的新任务进来时,会直接复用这个闲置容器,容器内所有文件系统的修改(包括你在仓库目录外创建的workspace目录)都会被完整保留,直到容器因闲置超时、资源不足等原因被Runner主动清理。

二、获取干净容器的解决办法

1. 全局禁用容器复用(推荐)

修改GitLab Runner的config.toml配置文件(通常位于Runner安装目录下),在对应Runner的配置区块中添加disable_container_reuse = true参数,强制Runner为每个任务创建全新容器,任务结束后立即销毁。

配置示例:

[[runners]]
  name = "docker-small-runner"
  url = "https://你的GitLab实例地址/"
  token = "你的Runner令牌"
  executor = "docker"
  [runners.docker]
    image = "ubuntu:latest"
    disable_container_reuse = true  # 关键配置,禁用容器复用
    # 保留其他原有配置...

修改完成后,重启GitLab Runner服务使配置生效。

2. 任务内手动清理环境

如果不想修改全局Runner配置,可在任务的script开头添加清理命令,提前删除残留的workspace目录:

build_application:
  tags:
      - docker-small
  image: ${CI_REGISTRY}/docker/common/stm32cubeide:latest
  stage: build_software
  script:
    - cd .. && rm -rf workspace || true  # 清理旧目录,不存在时不报错
    - mkdir workspace
    - headless-build.sh -data ./workspace -import project/ -build all
  artifacts:
    paths:
      - Debug/out.bin  # 注意:Linux容器需用正斜杠,原配置的反斜杠会导致路径识别失败

3. 用before_script统一处理前置清理

若多个任务都需要干净环境,可通过before_script定义通用的前置清理逻辑:

build_application:
  tags:
      - docker-small
  image: ${CI_REGISTRY}/docker/common/stm32cubeide:latest
  stage: build_software
  before_script:
    - cd .. && rm -rf workspace || true
  script:
    - mkdir workspace
    - headless-build.sh -data ./workspace -import project/ -build all
  artifacts:
    paths:
      - Debug/out.bin

内容的提问来源于stack exchange,提问作者Guilhem G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:27:18