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

Maj*_*abi 2 docker gitlab-ci gitlab-ci-runner

我查看了任何其他问题,但找不到自己的解决方案!我在 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 .
Run Code Online (Sandbox Code Playgroud)

我知道 gitlab runner 必须注册才能使用docker和分享/var/run/docker.sock!但是在使用 gitlab 自带的 runner 时怎么做呢?

gra*_*pes 8

啊,这是我可爱的话题 - 使用dockerfor 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
Run Code Online (Sandbox Code Playgroud)

优点

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

缺点:您必须为该服务配置 docker 注册表,否则Dockerfile每次管道启动时您都会从头开始构建 s。至于我,这是不可接受的,因为根据您拥有的容器数量,可能需要一个多小时。

方式 2 - 共享/var/run/docker.sock主机 docker 守护进程

我们使用 docker daemon 设置我们自己的 docker executor 并通过将其添加到/etc/gitlab-runner/config.toml文件中来共享套接字。因此,我们使我们机器的 docker 守护进程可用于docker cli容器内部。注意-在这种情况下,您不需要执行程序的特权模式。

之后,我们可以在我们的自定义 docker 镜像中同时使用dockerdocker-compose。此外,我们不需要特殊的 docker 注册表,因为在这种情况下,我们在所有容器之间共享执行程序的注册表。

缺点

在这种情况下,您需要以某种方式将源代码传递给您的容器,因为您只将它们安装到 docker executor,而不是从它启动的容器。我们已经停止使用类似的命令克隆它们git clone $CI_REPOSITORY_URL --branch $CI_COMMIT_REF_NAME --single-branch /project