K8s部署Gitlab Runner连接Docker主机失败问题求助
解决Kubernetes中Gitlab Runner连接Docker daemon失败的问题
错误原因分析
你遇到的Connection refused错误,核心原因是Docker daemon的访问地址配置错误,同时Runner配置与CI流水线配置存在冲突:
- 在
.gitlab-ci.yml中启用了docker:dind服务,但将DOCKER_HOST指向localhost:2375——dind服务作为独立容器运行在同一Pod内,主容器需通过服务名而非localhost访问它。 - Runner的
values.yaml中同时挂载了主机的docker.sock,这会与dind服务的Docker daemon产生冲突。
解决方案(推荐使用docker:dind服务)
1. 修正.gitlab-ci.yml中的Docker主机地址
将maven-build-image-prod任务里的DOCKER_HOST变量修改为dind服务的容器名(默认是服务name字段值docker),同时添加Docker客户端安装步骤(amazoncorretto:17默认不含Docker客户端):
maven-build-image-prod: only: - main - Dev stage: build variables: DOCKER_HOST: 'tcp://docker:2375' # 从localhost改为docker DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" services: - name: docker:19.03-dind entrypoint: ["dockerd-entrypoint.sh", "--tls=false"] script: - apt-get update && apt-get install -y docker.io - echo "Building image to container registry..." - ./mvnw spring-boot:build-image tags: - development-test
2. 清理Runner配置中的冲突挂载
编辑Gitlab Runner的values.yaml,移除挂载主机docker.sock和docker-config的hostPath卷(使用dind服务无需直接访问主机Docker资源):
# 保留其他配置,删除以下两段 # [[runners.kubernetes.volumes.host_path]] # name = "docker-socket" # path = "/var/run/docker.sock" # mount_path = "/var/run/docker.sock" # read_only = false # [[runners.kubernetes.volumes.host_path]] # name = "docker-config" # path = "/path/to/your/docker/config" # mount_path = "/etc/docker" # read_only = true
3. 重新部署Gitlab Runner
执行Helm升级命令应用配置更改:
helm upgrade gitlab-runner gitlab/gitlab-runner -n gitlab-runner -f values.yaml
备选方案(直接使用主机Docker daemon,不推荐)
若坚持使用主机的Docker daemon,需做以下调整:
- 删除
.gitlab-ci.yml中的docker:dind服务及相关变量:
maven-build-image-prod: only: - main - Dev stage: build variables: DOCKER_DRIVER: overlay GIT_STRATEGY: clone script: - echo "Building image to container registry..." - ./mvnw spring-boot:build-image tags: - development-test
- 确保主机
/var/run/docker.sock权限正确,Runner的Pod服务账号拥有足够权限访问主机资源。 - 在Runner所在节点执行
docker ps,验证主机Docker daemon是否正常运行。
内容的提问来源于stack exchange,提问作者Akylson
相关产品推荐
相关产品推荐

