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

