我看了其他任何问题,但找不到自己的解决方案!我在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运行程序必须注册才能使用docker
并共享/var/run/docker.sock
!但是当使用gitlab自己的运行器时该怎么做?
答案 0 :(得分:2)
啊,那是我的可爱话题-为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
中的工作,因为它们直接被拉到了dockerrunner上 缺点:您必须为此服务配置Docker注册表,否则,每次管道启动时,都会从头开始构建Dockerfile
。对于我来说,这是不能接受的,因为可能要花费一个多小时,具体取决于您拥有的容器数量。
方法2-共享主机docker守护程序的/var/run/docker.sock
我们使用docker守护进程设置了自己的docker executor,并通过将其添加到/etc/gitlab-runner/config.toml
文件中来共享套接字。因此,我们使容器中的docker cli
可以使用我们机器的docker守护程序。 注意-在这种情况下,您不需要执行者具有特权模式。
之后,我们可以在自定义docker映像中同时使用docker
和docker-compose
。而且,我们不需要特殊的Docker注册表,因为在这种情况下,我们在所有容器之间共享执行者的注册表。
缺点
在这种情况下,您需要以某种方式将源传递到您的容器,因为您只能将它们安装到docker executor,而不安装到从其启动的容器。我们已停止使用git clone $CI_REPOSITORY_URL --branch $CI_COMMIT_REF_NAME --single-branch /project