GitLab Runner Docker Compose自动注册后容器自动销毁问题求助
GitLab Runner容器注册后立即销毁的原因及解决方案
原因
GitLab Runner镜像的默认启动命令是运行持续服务进程gitlab-runner run,以此维持容器长期运行。而你在Compose配置中指定的register命令是一次性执行的注册操作——当注册流程完成后,该命令执行结束,容器的主进程随之退出,Docker会自动销毁容器。
解决方案
方案一:分步执行注册与启动(简单直接)
先通过一次性容器完成注册,再启动Runner服务容器:
- 执行注册命令(临时容器,执行后自动销毁):
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
- 修改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
- 启动Runner服务:
docker-compose up -d
方案二:自定义启动脚本实现自动注册(无需手动分步)
通过自定义脚本让容器启动时自动检查注册状态,未注册则执行注册,随后启动Runner服务,确保容器持续运行:
- 在宿主机的
/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
- 给脚本添加执行权限:
chmod +x /myrepository/gitlab-runner/entrypoint.sh
- 修改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
- 启动容器:
docker-compose up -d
说明:方案二中的脚本会避免重复注册——Runner注册成功后会生成
config.toml配置文件,后续启动时脚本检测到已注册会直接启动服务,不会重复执行注册命令。
内容的提问来源于stack exchange,提问作者Knuckle
相关产品推荐
相关产品推荐

