我查看了其他问题,但找不到自己的解决方案!我在 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
。您遇到的问题更广为人知的是 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
这样的命令来克隆它们
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"
要解决此问题,您可以尝试以下步骤:
ls -l /var/run/docker.sock
确保该文件归 root
staff
组所有。权限应允许所有者和组进行读写访问。
sudo chown root:staff /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
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
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
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
[[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