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

Docker部署本地GitLab实例,CI作业无法自克隆问题求助

问题根源

当GitLab Runner以Docker-in-Docker模式运行时,CI作业会在独立的Docker容器内执行——这个容器里的localhost指向的是作业容器自身,而非宿主机上运行的GitLab实例,因此出现连接拒绝的错误。

解决方案

下面提供几种可行的解决办法,按推荐程度排序:

方法1:将GitLab和Runner加入同一个自定义Docker网络

这是最规范的Docker容器通信方式,能保证容器间的网络隔离与正常解析:

  1. 创建自定义Docker网络
    docker network create gitlab-network
    
  2. 停止并重新启动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
    
  3. 停止并重新启动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
    
  4. 后续CI作业中,克隆地址改用网络别名gitlab代替localhost,比如:
    git clone http://gitlab/myusername/myproject.git
    
    也可以在GitLab项目设置里修改仓库的HTTP地址为http://gitlab/...,这样CI会自动使用正确的地址。

方法2:使用宿主机的实际IP地址代替localhost

直接用宿主机在局域网或Docker内部的IP来访问GitLab:

  1. 查看宿主机的Docker内部IP(或者局域网IP)
    • 查看Docker网关IP:ip addr show docker0,通常是172.17.0.1
    • 或者查看宿主机的局域网IP:ifconfig(Linux)或ipconfig(Windows)
  2. 修改GitLab项目的克隆URL,将localhost替换为查到的IP,比如:
    git clone http://172.17.0.1/myusername/myproject.git
    
  3. 也可以在GitLab Runner的配置文件/srv/gitlab-runner/config/config.toml中添加clone_url配置,指定GitLab的实际地址:
    [[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 = 0
    
    修改后重启Runner:docker restart gitlab-runner

方法3:让作业容器使用宿主机网络(不推荐)

这种方式会让作业容器直接使用宿主机的网络栈,localhost会指向宿主机,但会破坏容器的网络隔离性,仅适合临时测试:

  1. 编辑GitLab Runner的配置文件/srv/gitlab-runner/config/config.toml,在[runners.docker]下添加network_mode = "host":
    [runners.docker]
      image = "alpine:latest"
      network_mode = "host"
      # 其他配置...
    
  2. 重启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:55:46