GitLab Runner Docker容器使用GitLab容器ID作为克隆URL问题求助
这种问题我碰到过好几次,都是Docker环境下GitLab和Runner网络配置的锅——Runner没办法正确识别你的GitLab实例的外部可访问地址,反而用了容器内部的ID来生成克隆URL,自然连不上。给你几个一步步的解决办法:
启动GitLab容器时,必须通过环境变量指定external_url,这个地址得是Runner所在环境(不管是主机还是其他容器)能直接访问到的,不能是容器内部的IP或者ID。比如启动命令可以这么写:
docker run --detach \ --hostname gitlab.example.com \ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://192.168.1.100:8080';" \ --publish 8080:80 --publish 8443:443 --publish 2222:22 \ --name gitlab \ gitlab/gitlab-ce:latest
这里的external_url要填你主机的IP+端口,或者可解析的域名,确保Runner能通过这个地址访问到GitLab。
如果你的Runner也是用Docker容器部署的,强烈建议把它和GitLab容器加入同一个自定义Docker网络,这样它们可以通过容器名互相访问,不会出现地址解析混乱的问题:
- 先创建自定义网络:
docker network create gitlab-network
- 重新启动GitLab容器并加入这个网络:
docker run --detach \ --hostname gitlab \ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab:8080';" \ --publish 8080:80 --publish 8443:443 --publish 2222:22 \ --name gitlab \ --network gitlab-network \ gitlab/gitlab-ce:latest
- 注册Runner时,GitLab地址填容器名对应的URL(比如
http://gitlab:8080),同时让Runner也加入这个网络:
docker run --rm -it \ --network gitlab-network \ gitlab/gitlab-runner:latest register \ --url http://gitlab:8080/ \ --registration-token YOUR_REGISTRATION_TOKEN \ --executor docker \ --docker-image alpine:latest \ --docker-network-mode gitlab-network
这样Runner就能通过容器名gitlab正确解析GitLab地址,不会再用到容器ID。
clone_url(兜底方案) 如果上面的方法还没解决问题,可以手动修改Runner的config.toml配置文件,强制指定克隆用的URL。找到配置文件(容器部署的话通常在挂载的卷里,比如/srv/gitlab-runner/config/config.toml),在[[runners]]区块里添加clone_url字段:
[[runners]] name = "My Docker Runner" url = "http://gitlab:8080/" clone_url = "http://192.168.1.100:8080/" token = "YOUR_RUNNER_TOKEN" executor = "docker" [runners.docker] tls_verify = false image = "alpine:latest" privileged = false volumes = ["/cache"] network_mode = "gitlab-network"
这里的clone_url填主机能访问的GitLab地址,Runner克隆时会直接用这个URL,跳过自动生成的容器ID地址。
启动GitLab容器时的--hostname参数是关键,GitLab会用这个主机名生成仓库的克隆地址。如果没设置,它就会默认用容器ID当主机名,这正是你遇到的问题根源,所以一定要给GitLab容器指定一个固定的主机名。
内容的提问来源于stack exchange,提问作者Chad Blomquist

