GitLab CI Runner部署Docker容器失败:无法连接Docker守护进程
解决GitLab CI Runner无法连接Docker Daemon的问题
你遇到的核心问题是GitLab CI的Docker Executor容器无法访问宿主机的Docker守护进程,同时你的配置里还有几个可以优化的点,我来一步步帮你解决:
1. 确保GitLab Runner正确挂载Docker Socket
当使用Docker executor时,Runner需要将宿主机的/var/run/docker.sock挂载到运行的Job容器中,这样容器内的Docker客户端才能和宿主机的Docker daemon通信。
检查你的GitLab Runner配置文件(通常路径是/etc/gitlab-runner/config.toml),确保runners.docker部分包含正确的volumes配置:
[[runners]] name = "你的Runner名称" url = "你的GitLab实例地址" token = "你的Runner令牌" executor = "docker" [runners.docker] image = "phusion/baseimage" privileged = false volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"] # 其他配置项...
修改完成后记得重启GitLab Runner服务:
sudo gitlab-runner restart
2. 解决Docker客户端缺失的问题
你选用的phusion/baseimage镜像默认没有安装Docker客户端,所以即使连接上了socket,docker info命令也会失败。这里有两个方案可选:
方案A:在Job脚本中安装Docker客户端
修改你的.gitlab-ci.yml,在执行docker info前添加安装步骤:
stages: - deploy deploy_staging: stage: deploy image: phusion/baseimage script: # 先安装Docker客户端 - apt-get update && apt-get install -y docker.io - docker info - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - mkdir -p ~/.ssh - eval $(ssh-agent -s) - '[[ -f /.dockerenv ]] && echo -e "Host *\nStrictHostKeyChecking no\n" > ~/.ssh/config' - ssh-add <(echo "$STAGING_PRIVATE_KEY") - apt-get install -y rsync - ssh -p22 gituser@STAGING-DK02 "mkdir -p /html/themes/_tmp"
方案B:使用自带Docker客户端的镜像
更高效的方式是直接用官方的docker镜像,它已经预装了Docker客户端:
stages: - deploy deploy_staging: stage: deploy image: docker:latest script: - docker info - 'which ssh-agent || ( apk add --no-cache openssh-client )' # Alpine系统用apk包管理 - mkdir -p ~/.ssh - eval $(ssh-agent -s) - '[[ -f /.dockerenv ]] && echo -e "Host *\nStrictHostKeyChecking no\n" > ~/.ssh/config' - ssh-add <(echo "$STAGING_PRIVATE_KEY") - apk add --no-cache rsync - ssh -p22 gituser@STAGING-DK02 "mkdir -p /html/themes/_tmp"
3. 检查Docker Socket的权限
如果已经挂载了socket但仍然报错,可能是宿主机上/var/run/docker.sock的权限问题。默认情况下,这个文件属于docker用户组,你可以:
- 将GitLab Runner用户加入
docker组(推荐):sudo usermod -aG docker gitlab-runner - 或者临时调整socket权限(不推荐长期使用,存在安全风险):
sudo chmod 666 /var/run/docker.sock
修改后重启Runner服务即可生效。
额外优化建议
- 你在脚本里重复执行了
apt-get update,可以合并成一次,减少不必要的网络请求。 - 使用
StrictHostKeyChecking no会关闭主机密钥检查,虽然方便但有安全隐患,建议提前将目标服务器的公钥添加到CI/CD的环境变量中,或者在Job里预先导入。
内容的提问来源于stack exchange,提问作者sacarr
相关产品推荐
相关产品推荐

