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

GitLab Runner Docker Compose自动注册后容器自动销毁问题求助

GitLab Runner容器注册后立即销毁的原因及解决方案

原因

GitLab Runner镜像的默认启动命令是运行持续服务进程gitlab-runner run,以此维持容器长期运行。而你在Compose配置中指定的register命令是一次性执行的注册操作——当注册流程完成后,该命令执行结束,容器的主进程随之退出,Docker会自动销毁容器。

解决方案

方案一:分步执行注册与启动(简单直接)

先通过一次性容器完成注册,再启动Runner服务容器:

  1. 执行注册命令(临时容器,执行后自动销毁):
docker-compose run --rm gitlab-runner register --non-interactive --url=MY_GITLAB_URL --registration-token=MY_TOKEN --executor=docker --docker-image=ruby:2.7 --name=myrunner --docker-pull-policy=always --locked=false --run-untagged=false --docker-privileged=false --limit=0 --tag-list=general,test
  1. 修改Compose配置,移除command块,设置restart: always保证服务持续运行:
version: '3.6'
services:
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    container_name: gitlab-runner
    restart: 'always'
    depends_on:
      - gitlab
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /myrepository/gitlab-runner:/etc/gitlab-runner
    networks:
      - gitlab
  1. 启动Runner服务:
docker-compose up -d

方案二:自定义启动脚本实现自动注册(无需手动分步)

通过自定义脚本让容器启动时自动检查注册状态,未注册则执行注册,随后启动Runner服务,确保容器持续运行:

  1. 在宿主机的/myrepository/gitlab-runner/目录下创建entrypoint.sh脚本:
#!/bin/bash
set -e

# 检查是否已完成注册(判断config.toml是否存在且包含指定runner名称)
if [ ! -f /etc/gitlab-runner/config.toml ] || ! grep -q "name = \"myrunner\"" /etc/gitlab-runner/config.toml; then
  # 执行注册命令
  gitlab-runner register --non-interactive \
    --url=MY_GITLAB_URL \
    --registration-token=MY_TOKEN \
    --executor=docker \
    --docker-image=ruby:2.7 \
    --name=myrunner \
    --docker-pull-policy=always \
    --locked=false \
    --run-untagged=false \
    --docker-privileged=false \
    --limit=0 \
    --tag-list=general,test
fi

# 启动GitLab Runner服务(替换为镜像默认的主进程)
exec gitlab-runner run
  1. 给脚本添加执行权限:
chmod +x /myrepository/gitlab-runner/entrypoint.sh
  1. 修改Compose配置,指定自定义入口脚本:
version: '3.6'
services:
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    container_name: gitlab-runner
    restart: 'always'
    depends_on:
      - gitlab
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /myrepository/gitlab-runner:/etc/gitlab-runner
    entrypoint: ["/etc/gitlab-runner/entrypoint.sh"]
    networks:
      - gitlab
  1. 启动容器:
docker-compose up -d

说明:方案二中的脚本会避免重复注册——Runner注册成功后会生成config.toml配置文件,后续启动时脚本检测到已注册会直接启动服务,不会重复执行注册命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:05:20