GitLab Runner无法检测Docker 流水线连接失败求助
GitLab Runner Docker流水线连接失败及docker:dind启动异常解决方法
问题概述
在自有域名GitLab环境使用VPS部署的GitLab Runner时,基础流水线可正常运行,但执行Docker相关流水线时出现DNS解析错误:
error during connect: Post http://docker:2375/v1.40/auth: dial tcp: lookup docker on 192.168.0.222:53: server misbehaving
同时完整日志显示docker:dind服务启动异常,存在权限不足、模块目录缺失等问题。
此前尝试的两种流水线配置及Runner配置如下:
原流水线配置
stages: - push - deliver port9070-image-push: stage: push tags: - poc - maifee image: docker:stable services: - name: docker:dind alias: docker variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" script: - docker login -u $HARBOR_USERNAME -p $HARBOR_PASSWORD harbor.my-domain.bd - docker build -t harbor.my-domain.bd/library/port9070:latest -f Dockerfile . - docker push harbor.my-domain.bd/library/port9070:latest only: - dev - main
简化版流水线配置
stages: - push - deliver port9070-image-push: stage: push tags: - poc - maifee variables: DOCKER_TLS_CERTDIR: "" script: - docker login -u $HARBOR_USERNAME -p $HARBOR_PASSWORD harbor.my-domain.bd - docker build -t harbor.my-domain.bd/library/port9070:latest -f Dockerfile . - docker push harbor.my-domain.bd/library/port9070:latest only: - dev - main
已修改的GitLab Runner配置
concurrent = 1 check_interval = 0 shutdown_timeout = 0 [session_server] session_timeout = 1800 [[runners]] name = "PoC runner - maifee" url = "my.git.url" id = 0 token = "xyz" token_obtained_at = 0001-01-01T00:00:00Z token_expires_at = 0001-01-01T00:00:00Z executor = "docker" [runners.docker] tls_verify = false image = "docker:stable" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/cache"] shm_size = 0
解决方法
1. 复用宿主机Docker环境(推荐方案)
放弃docker:dind服务模式,直接挂载宿主机Docker socket,避免DNS解析和权限问题:
步骤1:修改GitLab Runner配置
编辑Runner配置文件,添加宿主机Docker socket挂载:
[[runners]] # 保留原有配置不变 [runners.docker] # 保留原有配置不变 volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
步骤2:重启GitLab Runner
sudo gitlab-runner restart
步骤3:调整流水线配置
更新流水线配置,指定使用Unix socket连接Docker:
stages: - push - deliver port9070-image-push: stage: push tags: - poc - maifee variables: DOCKER_HOST: unix:///var/run/docker.sock DOCKER_TLS_CERTDIR: "" script: - docker login -u $HARBOR_USERNAME -p $HARBOR_PASSWORD harbor.my-domain.bd - docker build -t harbor.my-domain.bd/library/port9070:latest -f Dockerfile . - docker push harbor.my-domain.bd/library/port9070:latest only: - dev - main
2. 修复docker:dind模式的DNS与权限问题(备选方案)
若必须使用docker:dind服务,按以下步骤调整:
步骤1:指定可靠DNS服务器
在流水线中为docker:dind服务添加DNS配置,避免解析失败:
stages: - push - deliver port9070-image-push: stage: push tags: - poc - maifee image: docker:stable services: - name: docker:dind alias: docker command: ["--dns", "8.8.8.8"] variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" script: - docker login -u $HARBOR_USERNAME -p $HARBOR_PASSWORD harbor.my-domain.bd - docker build -t harbor.my-domain.bd/library/port9070:latest -f Dockerfile . - docker push harbor.my-domain.bd/library/port9070:latest only: - dev - main
步骤2:确保镜像版本匹配
保证docker:stable镜像与docker:dind镜像版本一致(比如使用docker:dind:stable),避免版本不兼容导致的模块缺失问题。
步骤3:验证Runner权限
确认Runner配置中privileged = true已正确设置,且宿主机Docker服务正常运行:
sudo systemctl status docker
内容的提问来源于stack exchange,提问作者Maifee Ul Asad
相关产品推荐
相关产品推荐

