Mar*_*hac 8 unix-socket docker gitlab-ci gitlab-ci-runner docker-in-docker
我读过Can Anybodyterpret docker.sock来了解/var/run/docker.sock它的作用,但它在 GitLab CI 的Use Docker socket binding中的使用让我感到困惑。
这是他们的注册命令示例gitlab-runner:
sudo gitlab-runner register -n \
--url https://gitlab.com/ \
--registration-token REGISTRATION_TOKEN \
--executor docker \
--description "My Docker Runner" \
--docker-image "docker:19.03.12" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
我看到可以从两个地方获取生成的容器docker。
/var/run/docker.sock。docker包含在基础映像中的二进制文件docker:19.03.12。这不是PATH冲突吗?我认为应该是其中之一,我可以docker从主机的 unix 套接字或基本映像中获得使用的能力。
我认为--docker-image应该是ubuntu:latest或者不带有 的东西docker,因为已经来自主机套接字PATH。docker或者,可以移除 docker 套接字安装座。
关于 的双重包含,实际上发生了什么docker?
Unix 套接字文件/var/run/docker.sock通常由 Docker 守护进程创建。如果您运行其他程序作为主容器进程,则不会创建套接字。您可以通过运行具有非 Docker 主进程的容器来直接查看,例如/bin/ls:
docker run --rm docker:19.03.12 ls -l /var/run
docker run --rm docker:19.03.12 ls -l /run
Run Code Online (Sandbox Code Playgroud)
/usr/bin/docker如果您要使用该二进制文件,则该二进制文件必须存在于容器文件系统中。容器永远无法调用主机上的二进制文件,并且套接字 API 也不会生成二进制文件。(一些非常早期的“使用主机的 Docker 套接字”帖子主张将二进制文件绑定安装到容器中,但这会导致库依赖项出现问题,并使图像不是独立的。)
因此,如果您实际需要的是一个带有docker二进制文件的 Docker 容器,可以调用主机的 Docker 套接字,那么您需要一个像docker具有的映像/usr/bin/docker,另外您还需要将主机绑定挂载/var/run/docker.sock到容器中。
docker run \
--rm \
-v /var/run/docker.sock:/var/run/docker.sock \
docker:19.03.12 \
docker ps
Run Code Online (Sandbox Code Playgroud)
您链接到的 GitLab 设置似乎相当做作。使用docker映像运行作业意味着构建步骤几乎唯一docker可以运行的就是命令。docker在技术层面上,如果没有docker二进制文件并无法访问正在运行的 Docker 守护进程,则无法启动容器;该页面顶部描述的 shell 执行器方法似乎更简单,并且实际上没有任何缺点。
您还可能会发现拥有构建时依赖项(编译器、头文件、静态检查工具等)的 Docker 映像很方便。这将使您可以更新这些依赖项,而无需对整个构建集群进行更新。如果您的构建脚本本身需要调用docker,那么您的构建工具映像需要安装 Docker,只需使用普通RUN apt-get install命令即可。您需要以相同的方式将主机的 Docker 套接字推送到容器中,因此不需要启动单独的 Docker 守护进程。
| 归档时间: |
|
| 查看次数: |
14388 次 |
| 最近记录: |