GitLab Kubernetes Runner执行Docker构建时连接Docker守护进程失败求助
解决GitLab CI/CD Kubernetes执行器下Docker Daemon连接失败问题
看起来你遇到了Kubernetes执行器下GitLab CI/CD使用docker-in-docker(dind)时无法连接Docker daemon的问题,这是个很常见的场景,我来帮你一步步解决:
问题根源
当使用Kubernetes执行器运行docker:dind服务时,Docker daemon默认监听TCP端口(而非主机的unix socket),同时运行Docker daemon需要容器拥有特权模式权限,这两个条件没满足就会出现你看到的错误。
具体解决步骤
1. 调整.gitlab-ci.yml配置,添加必要环境变量
需要指定Docker客户端连接到docker:dind服务的TCP地址,同时如果是新版Docker镜像,还需要禁用TLS(测试环境快速验证用,生产环境建议配置证书):
# This file is a template, and might need editing before it works on your project. # Official docker image. image: docker:latest services: - docker:dind # 添加环境变量,指定Docker daemon地址并禁用TLS(测试用) variables: DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY build-master: stage: build script: - docker build --pull -t "$CI_REGISTRY_IMAGE" . - docker push "$CI_REGISTRY_IMAGE" only: - master build: stage: build script: - docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" . - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" except: - master
2. 配置GitLab Runner为特权模式
Docker daemon需要特权权限才能在容器内正常运行,所以必须确保你的GitLab Runner在Kubernetes中以特权模式启动:
如果你用Helm安装Runner
修改Helm的values.yaml文件,添加/修改以下配置:
runners: privileged: true
然后执行Helm升级命令应用配置:
helm upgrade --install gitlab-runner gitlab/gitlab-runner -f values.yaml
如果你手动配置Runner
找到Runner的config.toml文件,在Kubernetes执行器部分添加privileged = true:
[[runners]] executor = "kubernetes" [runners.kubernetes] privileged = true
然后重启GitLab Runner的Pod让配置生效。
3. 验证配置
重新触发流水线,检查Job日志:
- 确认
DOCKER_HOST变量已正确注入 - 可以通过
kubectl describe pod <runner-job-pod-name>查看Pod的SecurityContext,确认Privileged字段为true
额外说明
生产环境中不建议禁用TLS,建议配置docker:dind的TLS证书来保证通信安全,你可以参考GitLab官方文档的相关配置来实现。
内容的提问来源于stack exchange,提问作者alexus
相关产品推荐
相关产品推荐

