GitLab CI流水线Connection refused错误主因是Runner无法连通目标服务,需依次排查external_url配置、clone_url覆盖、dind的docker.sock挂载、私有仓库insecure-registries设置及Git代理/hosts干扰。

如果您在执行 GitLab CI 流水线时遇到 Connection refused 错误,该问题通常并非单纯由 Runner 本身未启动导致,而是 Runner 在尝试连接 GitLab 实例 API、内部服务(如 Docker daemon)、私有镜像仓库或源代码仓库时,因地址不可达、协议不匹配或网络策略阻断而触发。以下是多种可能成因及对应排查路径:
一、GitLab external_url 配置为内网地址
Runner 注册成功后,在执行 job 时会依据 GitLab 实例的 external_url 构造克隆 URL 和 API 调用地址。若该配置指向内网 IP 或 localhost,则外部 Runner 或容器内进程无法访问该地址,直接报 Connection refused。
1、登录 GitLab 管理员后台,进入 Admin Area → Settings → General → Visibility and access controls → Outbound requests,确认 external_url 值是否可被 Runner 所在主机解析并连通。
2、检查 GitLab 服务器上 /etc/gitlab/gitlab.rb 文件中 external_url 的值,例如:external_url "http://192.168.10.5:8080" —— 此配置将导致外网 Runner 无法回连。
3、将其修改为实际可访问的外网域名或公网 IP,例如:external_url "https://gitlab.example.com"。
4、执行 sudo gitlab-ctl reconfigure 使配置生效,并重启 GitLab 服务。
二、Runner 的 clone_url 覆盖配置错误
当 GitLab 实例位于 NAT 后或反向代理之后,Runner 默认使用的克隆地址(由 external_url 推导)可能不可达。此时需显式指定 clone_url,确保 job 容器能通过有效网络路径拉取代码。
1、编辑 Runner 配置文件 /etc/gitlab-runner/config.toml。
2、在对应 [[runners]] 段落内添加或修改字段:clone_url = "https://gitlab.example.com"(必须与实际可达地址一致)。
3、确认该地址可通过 Runner 主机执行 curl -I https://gitlab.example.com 返回 200 或 302。
4、重启 Runner 服务:sudo gitlab-runner restart。
三、Docker-in-Docker(dind)场景下 docker.sock 挂载缺失
使用 docker:dind 类型 executor 时,job 容器需与宿主机 Docker daemon 通信。若未将 /var/run/docker.sock 挂载进容器,docker 命令将无法连接本地 daemon,报出 dial tcp ...: connection refused。
1、打开 Runner 配置文件 /etc/gitlab-runner/config.toml。
2、定位到 [runners.docker] 区块。
3、在 volumes 列表中加入挂载项:"/var/run/docker.sock:/var/run/docker.sock"。
4、确保该路径在宿主机真实存在且权限允许读写(ls -l /var/run/docker.sock 应显示 socket 文件)。
5、重启 Runner:sudo gitlab-runner restart。
四、私有镜像仓库(如 Harbor)启用 HTTPS 但未配置 insecure-registries
Runner job 中执行 docker login 或 docker pull 私有仓库镜像时,若仓库以 HTTP 方式部署,而客户端默认按 HTTPS 协议发起请求,将因端口 443 不响应而触发 Connection refused。
1、检查私有仓库实际访问协议与端口,例如 http://172.17.8.201:8003。
2、在 Runner 所在主机编辑 /etc/docker/daemon.json,添加 insecure-registries 条目:
3、写入内容示例:{"insecure-registries":["172.17.8.201:8003"]}。
4、执行 sudo systemctl restart docker 重启 Docker 服务。
5、验证:在 Runner 主机运行 docker info | grep -i insecure,确认配置已加载。
五、Git 客户端代理或 hosts 配置干扰
Runner 进程继承系统级或用户级 Git 配置。若 Git 被强制设置 HTTP/HTTPS 代理(如指向本地未运行的代理端口),或 /etc/hosts 将 GitLab 域名解析至 127.0.0.1,均会导致 Connection refused。
1、在 Runner 主机执行:git config --global --get http.proxy 和 git config --global --get https.proxy,检查输出。
2、若返回非空值,执行:git config --global --unset http.proxy 与 git config --global --unset https.proxy。
3、检查系统 hosts 文件:sudo cat /etc/hosts | grep -i 'gitlab\|your-domain'。
4、临时注释掉疑似干扰行(在行首加 #),保存后测试 git ls-remote http://gitlab.example.com/group/project.git 是否成功。


















