无法连接到 gitlab CI 中 unix:///var/run/docker.sock 的 Docker 守护进程

问题描述 投票:0回答:5

我查看了其他问题,但找不到自己的解决方案!我在 gitlab 中设置 CI 并使用 gitlab 的共享运行器。在构建阶段,我使用 docker 镜像作为基础镜像,但是当我使用

docker
命令时,它说:

无法连接到位于 unix:///var/run/docker.sock 的 Docker 守护进程。 docker 守护进程是否正在运行?

我看了这个主题,但仍然不明白我应该做什么?

.gitlab-ci.yml:

stages:
  - test
  - build
  - deploy

job_1:
  image: python:3.6
  stage: test
  script:
    - sh ./sh_script/install.sh
    - python manage.py test -k

job_2:
  image: docker:stable
  stage: build
  before_script:
    - docker info
  script:
    - docker build -t my-docker-image .

我知道gitlab runner必须注册才能使用

docker
并分享
/var/run/docker.sock
!但是使用 gitlab 自带的 runner 时该怎么做呢?

docker gitlab-ci gitlab-ci-runner
5个回答
29
投票

啊,这是我可爱的话题 - 使用

docker
代表
gitlab ci
。您遇到的问题更广为人知的是
docker-in-docker

在配置之前,您可能需要阅读这篇精彩的文章:http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

这会让您稍微了解问题是什么以及哪种解决方案最适合您。一般来说有两种主要方法:在

docker
内部实际安装
docker
守护进程以及将主机的守护进程共享给容器。选择哪种方法 - 取决于您的需求。

gitlab
你可以通过多种方式去,我只是分享我们的经验。

方式 1 - 使用

docker:dind
作为服务。

设置非常简单。只需将

docker:dind
作为共享服务添加到您的
gitlab-ci.yml
文件中,并使用
docker:latest
图像来完成您的工作。

image: docker:latest  # this sets default image for jobs
services:
  - docker:dind

优点

  • 设置简单。
  • 运行简单 - 默认情况下,您的源代码可用于您在
    cwd
    中的工作,因为它们被直接拉到您的 docker runner

缺点:您必须为该服务配置 docker 注册表,否则每次管道启动时,您都会从头开始构建

Dockerfile
。对于我来说,这是不可接受的,因为可能需要一个多小时,具体取决于您拥有的容器数量。

方式2 - 共享主机docker守护进程的

/var/run/docker.sock

我们使用 docker 守护进程设置我们自己的 docker 执行器,并通过将其添加到

/etc/gitlab-runner/config.toml
文件中来共享套接字。因此,我们使机器的 docker 守护进程可用于容器内的
docker cli
注意 - 在这种情况下,执行程序不需要特权模式。

之后,我们可以在自定义 Docker 镜像中使用

docker
docker-compose
。此外,我们不需要特殊的 docker 注册表,因为在这种情况下,我们在所有容器之间共享执行器的注册表。

缺点

在这种情况下,您需要以某种方式将源传递到容器,因为您只将它们安装到 docker 执行器,而不是从它启动的容器。我们已经停止使用像

git clone $CI_REPOSITORY_URL --branch $CI_COMMIT_REF_NAME --single-branch /project

 
这样的命令来克隆它们


2
投票
我尝试将其添加到运行程序配置下的舵图部署中,并且 docker 开始工作,如果您在 Kubernetes 中部署了运行程序,请使用它。

runners: config: | [[runners]] [runners.kubernetes] namespace = "{{.Release.Namespace}}" image = "ubuntu:18.04" privileged = true [[runners.kubernetes.volumes.host_path]] name = "docker" mount_path = "/var/run/docker.sock"
    

1
投票
运行 Gitlab Runner(具有权限)

似乎即使为 Bitnami gitlab-runner 容器提供了额外的权限,它在尝试访问 Docker 守护进程套接字时仍然遇到权限问题。

要解决此问题,您可以尝试以下步骤:

  1. 检查 macOS 计算机上 Docker 套接字文件的所有权和权限。打开终端并运行以下命令:

    ls -l /var/run/docker.sock
    确保该文件归 

    root

     用户和 staff
     组所有。权限应允许所有者和组进行读写访问。

  2. 如有必要,调整 Docker 套接字文件的所有权和权限。在终端中运行以下命令:

    sudo chown root:staff /var/run/docker.sock sudo chmod 660 /var/run/docker.sock
    
    
  3. 使用更新后的 Docker 套接字所有权和权限重新启动 Bitnami gitlab-runner 容器。运行以下命令:

    sudo docker run -it --user=root -v /var/run/docker.sock:/var/run/docker.sock -v /Users/Shared/gitlab-runner/config:/etc/gitlab-runner bitnami/gitlab-runner
    
    
如果您仍然无法运行之前的命令,,

运行最后一个命令以确保 Gitlab-runner 容器以 root 权限运行,从而允许它访问 Docker Daemon Socket。

通过在命令中指定

--user=root

,您可以确保 Bitnami gitlab-runner 容器以 root 权限运行,这应该允许它访问 Docker 守护进程套接字。

通过这些步骤,Bitnami gitlab-runner 容器应该能够连接到 Docker 守护进程并执行 Docker 相关任务,而不会遇到权限被拒绝的错误。

sudo docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /Users/Shared/gitlab-runner/config:/home/gitlab-runner/.gitlab-runner bitnami/gitlab-runner
    

1
投票
这对我有用。特别是

DOCKER_HOST

 变量是成功的最后一根稻草。但无法告诉你原因,抱歉!

# .gitlab-ci.yml # github runs docker right out of the box # gitlab... not so much apparently # https://stackoverflow.com/a/70813945/5563327 services: - docker:dind variables: DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" DOCKER_DRIVER: overlay2
    

0
投票
还必须添加插座作为音量:

[[runners]] name = "Builder" url = "https://gitlab.xxx.eu" id = 0 token = "XXX" token_obtained_at = 0001-01-01T00:00:00Z token_expires_at = 0001-01-01T00:00:00Z executor = "docker" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.docker] tls_verify = false image = "docker:latest" privileged = false disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["gitlab-shared-cache:/cache", "/var/run/docker.sock:/var/run/docker.sock"] shm_size = 0
    
© www.soinside.com 2019 - 2024. All rights reserved.