我利用Linux 32核心服务器作为Gitlab Runner主机。所有作业都在docker内部执行,其中一些作业执行坞构建。对于在码头访问码头,我们使用船坞船坞方法。
我注意到,在每次构建时,DinD都从docker-集线器获取Dockerfile中指定的基本映像。虽然这是合理的,但这并不是我所希望的,因为它浪费了相当多的时间。
是否有可能在主机(根)和构建容器(DinD)之间共享本地映像?
发布于 2022-04-06 11:42:30
是否有可能在主机和码头集装箱之间共享本地映像?
不是的。在/var/lib/docker中,实际的映像数据以不透明的安装特定形式存储,图像数据和容器数据在某种程度上是混合的。两个不同的Docker守护进程不能共享一个/var/lib/docker目录,并且无法将图像从一个Docker守护进程直接移动到另一个Docker守护进程。
如果每个构建都通过一个DinD容器启动一个新的Docker守护进程,那么它将从空的本地映像开始,并且每次都必须重新提取基本映像。如果您可以重新配置CI系统以重用主机的Docker守护进程,那么这将不是一个问题。
(在每次构建中提取基本映像可能是一种很好的做法,因为像ubuntu:20.04这样的映像会定期使用安全修复更新,但在正常操作中,Docker将能够判断映像实际上没有改变,只需要下载小的映像清单。如果每个构建都是从一个空状态开始的,那么这不是一个选项。)
发布于 2022-04-07 10:43:27
最后,我继续使用DinD服务,而没有显式地在config.toml中挂载套接字(我还想尝试挂载方法,以后可能会编辑这个答案)。我是这样做的,因为我发现了Gitlab指南,它最终帮助我减少了网络等待时间。
我基本上已经设置了一个本地注册表,并使用主机IP (hostname --ip-address)与运行程序共享它。
# docker-compose.yaml
version: '3'
services:
registry:
image: registry:2
container_name: registry
ports:
- "6000:5000"
environment:
- REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io
restart: always然后在我的config.toml中使用它(不要忘记重新启动运行程序)。
# /etc/gitlab-runner/config.toml
# [...]
[[runners.docker.services]]
name = "docker:dind"
command = ["--registry-mirror", "http://xxx.xxx.xxx.xxx:6000"]https://stackoverflow.com/questions/71765455
复制相似问题