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

Gitlab CI构建Docker镜像失败:无法连接docker:dind服务

解决GitLab CI中docker:dind服务无法连接的问题

问题根源

从日志能看到两个核心问题:

  • docker:dind服务启动时出现mount: permission denied,说明GitLab Runner的Docker executor未开启特权模式,dind需要特权权限才能挂载系统目录、加载内核模块,否则无法正常启动。
  • 主容器尝试连接http://docker:2375/_ping失败,因为新版本docker:dind默认启用TLS加密,监听2376端口而非明文的2375端口,客户端未适配TLS配置导致连接失败。

修复步骤

1. 开启GitLab Runner的特权模式

找到GitLab Runner的配置文件(通常路径为/etc/gitlab-runner/config.toml),修改对应runner的配置段,确保privileged = true:

[[runners]]
  name = "runner01"
  url = "你的GitLab实例地址"
  token = "你的runner token"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true  # 必须设置为true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0

修改完成后重启GitLab Runner服务:

sudo gitlab-runner restart

2. 调整.gitlab-ci.yml的环境变量

在publish任务中添加适配TLS的环境变量,让docker客户端正确连接dind服务:

publish:
    tags:
        - runner01
    image: docker:latest
    stage: publish
    services:
        - docker:dind
    variables:
        DOCKER_TLS_CERTDIR: "/certs"  # 启用TLS,对应dind生成的证书目录
        DOCKER_HOST: "tcp://docker:2376"  # 连接dind的TLS端口
    script:
        - docker build -t $TAG_COMMIT -t $TAG_LATEST .
        - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
        - docker push $TAG_COMMIT
        - docker push $TAG_LATEST

验证逻辑

  • 特权模式赋予dind服务足够权限完成系统级操作,解决启动时的挂载、模块加载错误。
  • 设置DOCKER_TLS_CERTDIR和DOCKER_HOST后,docker客户端会自动使用dind生成的证书,通过2376端口安全连接dind服务,避免主机找不到或连接被拒绝的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:25:57