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
相关产品推荐
相关产品推荐

