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

GitLab自托管Runner用Docker executor登录Docker报错求助

GitLab CI自托管Docker Runner推送镜像失败排查与解决

问题背景

在Windows系统下使用GitLab CI推送镜像至容器仓库,此前用共享Runner一切正常,切换为自托管Runner(Docker executor)后,执行docker login时出现主机解析失败的错误。

错误信息

$ echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin

error during connect: Post "http://docker:2375/v1.24/auth": dial tcp: lookup docker on 192.168.65.7:53: no such host 

当前.gitlab-ci.yml配置

stages:
   - test
   - build
run_tests:
   stage: test
   script:
       - echo "Testing"
   only:
       - merge_requests

build_image:
    stage: build
    image: docker:20.10.16
    services:
       - docker:20.10.16-dind
    variables:
       DOCKER_TLS_CERTDIR: "/certs"
    before_script:
       - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
    script:
       - docker build -t registry.gitlab.com/caronethiagoivan/ci-cd-frontend .
       - docker push registry.gitlab.com/caronethiagoivan/ci-cd-frontend
    rules:
        - if: $CI_PIPELINE_SOURCE == "merge_request_event"

解决方案

1. 调整CI变量,指定Docker主机地址

Windows环境下,Docker executor的dind服务默认docker主机名可能无法正常解析,直接在build_image的变量中指定DOCKER_HOST为本地TCP地址:

build_image:
    stage: build
    image: docker:20.10.16
    services:
       - docker:20.10.16-dind
    variables:
       DOCKER_TLS_CERTDIR: "/certs"
       DOCKER_HOST: tcp://localhost:2375  # 添加此变量
    before_script:
       - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
    script:
       - docker build -t registry.gitlab.com/caronethiagoivan/ci-cd-frontend .
       - docker push registry.gitlab.com/caronethiagoivan/ci-cd-frontend
    rules:
        - if: $CI_PIPELINE_SOURCE == "merge_request_event"

2. 检查自托管Runner的config.toml配置

确保Runner配置满足dind运行要求,重点检查以下项:

[[runners]]
  name = "Windows Docker Runner"
  url = "https://gitlab.com/"
  token = "你的Runner令牌"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:20.10.16"
    privileged = true  # 必须开启,dind需要特权模式启动Docker守护进程
    volumes = ["/cache", "/certs/client"]  # 挂载证书目录,适配TLS配置
    network_mode = "bridge"

3. 配置Windows Docker Desktop

  • 打开Docker Desktop设置,进入Docker Engine页面,确保开启hosts中的TCP监听:
    {
      "hosts": ["tcp://localhost:2375", "npipe://"]
    }
    
  • 如果使用TLS认证,需确保DOCKER_TLS_VERIFY=1和DOCKER_CERT_PATH=/certs/client变量在CI中正确设置。

4. 验证连接可用性

在before_script中添加测试命令,确认Docker守护进程可正常访问:

before_script:
   - ping localhost -n 3  # Windows环境测试网络连通性
   - docker info  # 验证Docker守护进程响应

内容的提问来源于stack exchange,提问作者marcelo gallardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:13:16