用ISO预装docker镜像以便重新分配

我们正在开发一个应用程序,将现场部署到各种安装(而不是云)。 我们的OEM合作伙伴要求我们为他们提供ISO,以便能够快速configuration新的服务器。 我们的应用程序是build立在容器周围,我们有一个私人的面向Internet的registry设置能够拉最新的传递构build。 我还不确定OEM合作伙伴是否能够自己提取这些图像,因此我们正在调查预装docker图像和ISO的可能性,但是有一些困难。 我们尝试过的一些事情:

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

  2. chroot监狱 – 再次,我们试图创build我们的用户,安装docker,但试图拉我们的图像时,我们迎接: failed to register layer: Error processing tar file(exit status 1): invalid argument无论我们拉什么形象(即使官方dockerUbuntu的形象,例如)。 Google对这个错误没有任何帮助。

  3. RancherOS – 在这里,我们find了预装docker 映像的说明,但不知道如何将它们与iso捆绑在一起 。 看起来我们和#1449有相同的用例,但是没有真正的解决scheme。

现在所有我能想到接下来的尝试是docker save我们的图像,并包括与ISO的tarball,然后当第一次启动ISO运行一个脚本来检查docker图像是否存在,如果不存在,做一个docker load每个然后运行他们虽然这看起来非常h​​acky和不可靠的,所以我想知道如果任何人有这种事情的经验,也许能够指出我在正确的方向。

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

我build议你将相关的systemd脚本打包到你的ISO中,并且让这些脚本处理加载或构build你的图像。

所以,对于一个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] 

如果你喜欢构build而不是加载,你也可以通过replace:

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等等)。

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