You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:28:05