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

GitLab Runner使用Docker DinD构建镜像时无法连接Docker守护进程

解决GitLab Runner Docker-in-Docker构建镜像的连接问题

一、修正.gitlab-ci.yml配置,正确连接dind服务

使用docker:20.10.23镜像和docker:20.10.23-dind服务时,无需依赖宿主机Docker daemon,应让任务中的Docker客户端连接dind服务容器内的daemon,而非宿主机端口。

正确的.gitlab-ci.yml示例:

stages:
  - build

build-image:
  stage: build
  image: docker:20.10.23
  services:
    - name: docker:20.10.23-dind
      alias: docker  # 给dind服务设置别名,简化客户端连接路径
  variables:
    DOCKER_HOST: tcp://docker:2376  # dind默认启用TLS,监听2376端口
    DOCKER_TLS_CERTDIR: "/certs"  # 指定dind自动生成TLS证书的目录,必填项
    DOCKER_DRIVER: overlay2
  before_script:
    - docker info  # 验证Docker客户端与dind服务的连接状态
  script:
    - docker build -t your-image:latest .
    - docker push your-image:latest

关键说明:

  • 任务容器内的localhost指向自身,而非dind服务或宿主机,因此不能用tcp://localhost:2375作为连接地址
  • dind默认禁用非TLS的2375端口,必须通过2376端口配合TLS证书连接

二、修复宿主机Docker daemon的错误配置

你修改daemon.json后出现的两类错误,按以下步骤修复:

1. 解决“can't create unix socket /var/run/docker.sock: is a directory”

  • 先检查/var/run/docker.sock的类型:
    ls -ld /var/run/docker.sock
    
  • 如果是目录,直接删除:
    sudo rm -rf /var/run/docker.sock
    
  • 重启Docker服务生效:
    sudo systemctl restart docker
    

2. 解决“Invalid bind address format: http://localhost:2375/”

daemon.json的hosts配置无需添加http://前缀,正确格式如下:

{
  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}

注意:如果仅使用dind完成镜像构建,无需暴露2375端口(存在安全风险),可只保留unix:///var/run/docker.sock。修改后重启Docker服务:

sudo systemctl restart docker

三、确认GitLab Runner的config.toml配置正确

确保Runner使用Docker executor并开启特权模式(dind必须依赖特权模式):

[[runners]]
  name = "Docker Runner"
  url = "https://your-gitlab-instance.com/"
  token = "your-runner-token"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:20.10.23"
    privileged = true  # 开启特权模式,dind服务需要此权限
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]  # 用dind时无需挂载宿主机的docker.sock
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

四、验证流程

  1. 将修改后的.gitlab-ci.yml提交至仓库
  2. 触发CI/CD流水线,查看before_script阶段的docker info输出是否正常
  3. 若docker info能返回daemon信息,说明连接正常,后续的docker build、docker push即可顺利执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:25:30