繁体   English   中英

Docker-in-Docker:访问主机镜像注册表

[英]Docker-in-Docker: access hosts image registry

我利用 Linux 32 核服务器作为 Gitlab Runner 主机。 所有作业都在 docker 内执行,其中一些作业执行 docker 构建。 为了访问 docker 中的 docker,我们使用tls 支持的 docker-in-docker方法。

我注意到在每次构建时,DinD 都会从 docker-hub 中获取 Dockerfile 中指定的基本映像。 虽然这是有道理的,但这并不是我想要的,因为它浪费了很多时间。

是否有可能在主机(root)和构建容器(DinD)之间共享本地图像?

是否有可能在主机和 [Docker-in-Docker] 容器之间共享本地图像?

不。实际图像数据以不透明的特定于安装的形式存储在/var/lib/docker中,并且图像和容器数据有些混合。 两个不同的 Docker 守护进程不能共享一个/var/lib/docker目录,并且无法直接将镜像从一个 Docker 守护进程移动到另一个。

如果每个构建都通过 DinD 容器启动一个新的 Docker 守护进程,那么它将以空的本地镜像开始,并且每次都必须重新拉取基础镜像。 如果您可以重新配置 CI 系统以重用主机的 Docker 守护程序,那么这将不是问题。

(在每次构建时拉取基础镜像可能是一个好习惯,因为像ubuntu:20.04这样的镜像会定期更新安全修复,但在正常操作中 Docker 将能够判断镜像实际上没有改变,只需要下载小图像清单。如果每个构建都从空的 state 开始,则这不是一个选项。)

我最终继续使用 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"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM