Docker部署本地GitLab实例,CI作业无法自克隆问题求助
问题根源
当GitLab Runner以Docker-in-Docker模式运行时,CI作业会在独立的Docker容器内执行——这个容器里的localhost指向的是作业容器自身,而非宿主机上运行的GitLab实例,因此出现连接拒绝的错误。
解决方案
下面提供几种可行的解决办法,按推荐程度排序:
方法1:将GitLab和Runner加入同一个自定义Docker网络
这是最规范的Docker容器通信方式,能保证容器间的网络隔离与正常解析:
- 创建自定义Docker网络
docker network create gitlab-network - 停止并重新启动GitLab容器,加入该网络并设置别名
docker stop gitlab docker rm gitlab sudo docker run --detach \ --hostname gitlab \ --publish 443:443 --publish 80:80 --publish 23:22 \ --name gitlab \ --restart always \ --network gitlab-network \ --network-alias gitlab \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ gitlab/gitlab-ee:latest - 停止并重新启动GitLab Runner,加入同一个网络
docker stop gitlab-runner docker rm gitlab-runner docker run -d --name gitlab-runner --restart always \ --network gitlab-network \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest - 后续CI作业中,克隆地址改用网络别名
gitlab代替localhost,比如:
也可以在GitLab项目设置里修改仓库的HTTP地址为git clone http://gitlab/myusername/myproject.githttp://gitlab/...,这样CI会自动使用正确的地址。
方法2:使用宿主机的实际IP地址代替localhost
直接用宿主机在局域网或Docker内部的IP来访问GitLab:
- 查看宿主机的Docker内部IP(或者局域网IP)
- 查看Docker网关IP:
ip addr show docker0,通常是172.17.0.1 - 或者查看宿主机的局域网IP:
ifconfig(Linux)或ipconfig(Windows)
- 查看Docker网关IP:
- 修改GitLab项目的克隆URL,将
localhost替换为查到的IP,比如:git clone http://172.17.0.1/myusername/myproject.git - 也可以在GitLab Runner的配置文件
/srv/gitlab-runner/config/config.toml中添加clone_url配置,指定GitLab的实际地址:
修改后重启Runner:[[runners]] name = "docker-runner" url = "http://172.17.0.1/" token = "your-runner-token" executor = "docker" clone_url = "http://172.17.0.1/" [runners.docker] image = "alpine:latest" privileged = false disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/cache"] shm_size = 0docker restart gitlab-runner
方法3:让作业容器使用宿主机网络(不推荐)
这种方式会让作业容器直接使用宿主机的网络栈,localhost会指向宿主机,但会破坏容器的网络隔离性,仅适合临时测试:
- 编辑GitLab Runner的配置文件
/srv/gitlab-runner/config/config.toml,在[runners.docker]下添加network_mode = "host":[runners.docker] image = "alpine:latest" network_mode = "host" # 其他配置... - 重启Runner:
docker restart gitlab-runner
验证方法
可以在CI作业中添加测试命令,验证网络连通性:
before_script: - ping -c 3 gitlab # 如果用方法1,测试网络别名 - ping -c 3 172.17.0.1 # 如果用方法2,测试宿主机IP - curl http://gitlab # 测试GitLab是否能正常访问
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

