使用 ISO 预加载 docker 映像以进行重新分发

DTI*_*att 10 deployment iso docker

我们正在开发一个应用程序,该应用程序将在现场部署到各种安装(不是云)。我们的 OEM 合作伙伴要求我们为他们提供 ISO,以便能够快速配置新服务器。我们的应用程序是围绕容器构建的,我们有一个面向互联网的私有注册表设置,能够提取最新的通过构建。我还不确定 OEM 合作伙伴是否能够自己拉取这些映像,因此我们正在研究将 docker 映像与 ISO 一起预打包的可能性,但遇到了一些困难。我们尝试过的一些事情:

  1. systemback - 我们尝试使用我们的首选设置(由我们拥有的 ansible 角色定义)配置新的 ubuntu 安装,然后使用 systemback 捕获结果。重新安装生成的 ISO 后,我们遇到了 docker 错误:Error response from daemon: open /var/lib/docker/aufs/layers/blahblahblah: no such file or directory类似于#22343

  2. chroot jail - 我们再次尝试创建我们的用户,安装 docker,但是在尝试拉取我们的镜像时,我们会遇到:failed to register layer: Error processing tar file(exit status 1): invalid argument不管我们拉的是什么镜像(甚至是官方的 docker ubuntu 镜像,例如)。谷歌对这个错误没有帮助。

  3. RancherOS - 在这里我们找到了打包 docker 镜像的说明,但没有找到如何将它们与 iso 捆绑在一起。看起来我们的用例与#1449相同,但没有真正的解决方案。

现在我能想到的下一步就是尝试docker save我们的图像并包含带有 ISO 的 tarball,然后在第一次启动 iso 时运行一个脚本来检查 docker 图像是否存在,如果它们不存在,则docker load对每个图像执行然后运行它们,尽管这看起来非常笨拙且不可靠,所以我想知道是否有人对此类事情有任何经验,并且可能能够指出我正确的方向。

iwa*_*rue 1

@迈克尔·汉普顿的回答对我来说似乎是正确的。

我建议您将相关的 systemd 脚本打包到 ISO 中,并让这些脚本处理加载或构建映像。

因此,对于 nginx 容器来说,您的单元文件可能如下所示:

[Unit]
Description=nginx
After=docker.service
Requires=docker.service


[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill nginx
ExecStartPre=-/usr/bin/docker rm nginx
ExecStartPre=-/usr/bin/docker load /path/to/compressed/image
ExecStart=/usr/bin/docker run --rm [your config here]
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢构建而不是加载,您也可以通过替换来做到这一点:

ExecStartPre=-/usr/bin/docker load /path/to/compressed/image

和:

ExecStartPre=-/usr/bin/docker build --rm -t 'my-nginx:latest' /path/to/folder_with_Dockerfile

您还可以使用 systemd 依赖项来确保事物以正确的顺序启动,和/或将容器链接在一起(例如,参见 systemd 的After/ BeforePartOf等)。

一般来说,我认为我不会花太多时间担心只加载/构建一次 - 特别是如果您要构建图像(而不是加载它们),这将允许您通过更新其本地 Dockerfile 来更新容器。如果您的注册表不可用,这可能是一个有用的功能。