无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误
Posted
技术标签:
【中文标题】无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误【英文标题】:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? Error on Gitlab Cloud CI/CD with self-hosted runners无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是否正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误 【发布时间】:2022-01-03 14:24:45 【问题描述】:我在 Ubuntu 18.04.6 LTS 上使用 gitlab-runner 版本 14.4.0 和 docker 版本 20.10.11 我用于跑步者的机器是功能强大的 Supermicro 服务器。我们的 Gitlab CI 在 gitlab cloud (SAAS) 上
我在构建阶段作业中收到以下错误:
-
错误:作业失败(系统故障):无法连接到位于 unix:///var/run/docker.sock 的 Docker 守护程序。 docker 守护进程是否正在运行? (exec.go:66:120s)
错误:作业失败(系统故障):无法连接到位于 unix:///var/run/docker.sock 的 Docker 守护程序。 docker 守护进程是否正在运行? (docker.go:708:120s)
准备失败:添加缓存卷:设置卷权限:为卷“runner-######-project-#####-concurrent-0-cache-#######创建权限容器#######":无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是否正在运行? (linux_set.go:90:120s)
错误:作业失败(系统故障):准备环境:无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是否正在运行? (docker.go:708:120s)。查看https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading了解更多信息
到目前为止我尝试过的解决方案:
-
添加了多拉策略:pull_policy = ["always", "if-not-present"]
在所有跑步者的 config.toml 中
授予 gitlab-runner 用户权限
对于 docker 和 sudo 组
试过 chmod 666 /var/run/docker.sock
systemctl docker enable & systemctl docker start
重新启动 gitlab-runner 并重新加载守护进程
用 Ubuntu 18.04.6 LTS、最新的 docker 和 gitlab-runner 从头开始安装机器
似乎没有什么能解决这个问题。通常只是在错误使作业运行后重新启动作业。但这不是解决方案。
我是新手,感谢任何帮助!
谢谢
【问题讨论】:
您能否发布您用于 GitLab 跑步者的config.toml
文件?这将为我们提供有关您如何配置它的更多信息,并将让我们提供更多帮助。
并发 = 70 check_interval = 1 [session_server] session_timeout = 1800 [[runners]] name = "runnr" url = "gitlab.com" token = "#####" executor = "docker " [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.docker] tls_verify = false image = "Ubuntu:18.04" privileged = false pull_policy = ["always", "if-not-present"] disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/cache"] shm_size = 0
您好@Patrick 感谢您的回复,请参阅上面我的 config.toml
【参考方案1】:
您遇到的问题是您试图使用 docker 套接字来构建容器,而实际上并未在执行程序中公开 docker 套接字。对于如何解决此问题,您有三种选择:
-
将 docker 套接字映射到运行器中。为此,在您指定
volumes
的地方,将 /var/run/docker.sock:/var/run/docker.sock
添加到映射卷的数组中。
将 docker-in-docker 与特权容器一起使用,这不需要您映射 docker 套接字,但需要您熟悉 DIND 的工作原理并遵循此处的说明:https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-the-docker-executor-with-the-docker-image-docker-in-docker
使用不需要 docker 套接字的东西来构建您的容器。我强烈建议使用 Kaniko 构建您的 docker 容器 - 它往往比 docker 更快,您可以完全忽略 docker 套接字的使用(这也使您的构建更安全):https://docs.gitlab.com/ee/ci/docker/using_kaniko.html#building-a-docker-image-with-kaniko
【讨论】:
非常感谢您的回答。我已经尝试了解决方案 1,并且还使用以下命令向 gitlab-runner 用户授予了 docker.sock 的权限: chown gitlab-runner:docker /var/run/docker.sock 我仍然面临同样的错误。由于我的互联网速度较慢,解决方案 2 和 3 对我来说并不理想。在我当前的环境中,我可以尝试其他任何解决方案吗? 由于 docker 守护进程本身的运行方式,在套接字上使用 chown 可能不会做任何事情,但如果它被正确暴露,你会得到一个不同的错误(权限被拒绝),所以它仍然没有暴露适当地。您的 Internet 本身不会对选项 2 或 3 产生任何影响(从 Internet 中提取的唯一内容是容器本身构建,即使您暴露了套接字,您也必须这样做),所以如果您我会建议那些插座。无论如何,选项 3 是迄今为止最好的做法。以上是关于无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误的主要内容,如果未能解决你的问题,请参考以下文章
无法使用php连接错误连接到mysql:无法连接到'localhost'(10061)上的MySQL服务器[重复]
MySQL Workbench 无法连接到我的 RDS 数据库:无法连接到 localhost
Django docker 容器无法连接到 mysql 容器,出现错误“无法连接到 'db' (111) 上的 MySQL 服务器”)