根据官方gitlab documentation,在docker build
管道中启用ci
的一种方法是使用dind
服务(就{{1}而言) } services)。
但是,由于在docker执行程序上运行ci作业总是如此,因此还需要gitlab-ci
图像。
有人可以解释一下:
docker:latest
和docker:dind
图片之间有什么区别?docker:latest
在一个ci工作?并不是docker build
图像(将在其中执行作业!)包含docker守护程序(我认为docker:latest
也是),这些是工具我们需要的命令是必要的(例如docker-compose
,docker build
等)?除非我错了,否则问题或多或少会变成:
为什么docker客户端和docker守护程序不能驻留在同一个docker(已启用)容器中
答案 0 :(得分:30)
docker:dind和docker之间有什么区别:最新图片?
docker:latest
包含连接到docker守护程序所需的所有内容,即运行docker build
,docker run
等。它还包含docker守护程序,但它不是作为入口点启动的。docker:dind
构建于docker:latest
并启动docker守护程序作为其入口点。因此,它们的内容几乎相同,但是通过它们的入口点,一个被配置为作为客户端连接到tcp://docker:2375
,而另一个用于守护进程。
为什么服务和泊坞窗图像都需要[...]?
你不需要两者。你可以使用两者中的任何一个,作为第一步启动dockerd
,然后像往常一样运行docker build
和docker run
命令here;显然这是gitlab at some point中的原始方法。但我发现只写service: docker:dind
而不是before_script
设置dockerd
更清楚。此外,你不必弄清楚如何开始&在基本映像中正确安装dockerd
(如果您没有使用docker:latest
。)
如果您知道您的跑步者正在将.gitlab-ci.yml
加载到您的图片中,您还可以轻松地在/var/run/docker.sock
中声明该服务,从而轻松更换docker-in-docker。您可以将protected variable DOCKER_HOST
设置为unix:///var/run/docker.sock
以获得更快的构建。其他无法访问此类跑步者的人仍然可以分配您的存储库并回退到dind
服务,而无需修改您的.giltab-ci.yml
。
答案 1 :(得分:-2)
容器将仅包含docker镜像中定义的内容。你知道你可以从基本图像开始安装任何东西。 但是你也可以在一个容器中安装Docker(deamon和client),也就是说Docker IN Docker(dind)。因此容器将能够运行其他容器。这就是为什么gitlab需要这个。