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

iaqfqrcu  于 2024-01-06  发布在  Docker
关注(0)|答案(5)|浏览(175)

我看了其他问题,但找不到自己的解决方案!我在gitlab中设置了一个CI,并使用gitlab的共享运行器。在构建阶段,我使用docker镜像作为基础镜像,但当我使用docker命令时,它说:
无法在unix:/var/run/docker. sock上连接到Docker守护进程。Docker守护进程是否正在运行?
我看了this主题,但仍然不明白我应该做什么?
.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时如何做到这一点呢?

pvabu6sv

pvabu6sv1#

啊,这就是我可爱的主题-使用dockergitlab 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 registry,否则你将在每次管道启动时从头开始构建Dockerfile s。至于我,这是不可接受的,因为可能需要一个多小时,具体取决于你拥有的容器数量。
    方式二-共享宿主docker守护进程/var/run/docker.sock

我们使用docker daemon设置了自己的docker executor,并通过将其添加到/etc/gitlab-runner/config.toml文件中来共享socket。因此,我们使机器的docker daemon可用于容器内的docker cli注意-在这种情况下,您不需要为executor设置特权模式。
之后,我们可以在自定义Docker镜像中使用dockerdocker-compose。此外,我们不需要特殊的Docker注册表,因为在这种情况下,我们在所有容器中共享executor的注册表。
缺点:
在这种情况下,你需要以某种方式将源代码传递给你的容器,因为你只将它们挂载到Docker执行器,而不是从它启动的容器。

z8dt9xmd

z8dt9xmd2#

我试着在runner配置下将其添加到我的helm chart部署中,docker开始工作,如果您在Kubernetes中部署了runner,请使用此选项。

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"

字符串

eoigrqb6

eoigrqb63#

运行Gitlab Runner(有权限)

看起来,即使为Bitnami gitlab-runner容器提供了额外的权限,它在尝试访问Docker守护进程套接字时仍然会遇到权限问题。
要解决此问题,您可以尝试以下步骤:
1.在macOS机器上检查Docker socket文件的所有权和权限。打开终端并运行以下命令:

ls -l /var/run/docker.sock

字符串
请确保该文件属于**root用户和staff**组。权限应允许所有者和组具有读写权限。
1.根据需要调整Docker socket文件的所有权和权限,在终端中运行以下命令:

sudo chown root:staff /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock


1.重新启动Bitnami gitlab-runner容器,并更新Docker socket的所有权和权限。运行以下命令:

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

wj8zmpe1

wj8zmpe14#

这对我很有效。特别是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

字符串

4uqofj5v

4uqofj5v5#

不得不添加插座作为卷:

[[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

字符串

相关问题