Jib maven插件如何在不使用docker守护程序的情况下构建映像?

问题描述

在过去的几个月中,我一直在试验docker,并享受在容器内构建和运行Java应用程序的好处。

几周前,我偶然发现了jib maven plugin,并发现臂架可以无需使用docker守护进程来为docker注册表构建映像。

将臂架添加到我的项目之一并运行mvn clean install jib:build(在未安装docker的VM上)后,令我感到惊讶的是臂架实际上构建并将包含我的项目的映像推送到远程注册表。

出于好奇,我上网阅读了更多有关臂架如何在未安装docker的情况下构建和推送docker映像的信息,但发现有关此主题的信息很少甚至没有。我设法找到一个article,它解释了不用docker来创建映像的几种方法,还试图通过阅读source code来了解maven目标jib:build的工作原理,但是两者都没有给出当您运行jib:build时,我对幕后发生的事情有任何见解。

如果有人不使用docker daemon共享更多有关jib maven插件以及它如何实际构建和将图像推入幕后的信息,我将不胜感激。

解决方法

(我将在一个非常高的水平上,从概念上非常轻松地触及该主题。请记住,以下内容仅涵盖图像构建的一个方面。)

从概念上讲,容器图像的解剖非常简单;它只是压缩包的集合,外加一些有关图像的元数据(约两个JSON文件)。如果以有序的方式解压缩一些tarball(具体来说是union mounting),就会得到一些文件和目录。这些基本上是您将在运行时获得并查看的映像的文件系统内容。在场景中放入几个小的JSON文件以获取有关图像的一些元数据(例如,运行时的环境变量,图像入口点,构成该图像的tarball等),并且您已经拥有了容器图像。然后,您通过Docker Registry API与容器注册表进行通信(即发送和接收HTTP请求和响应),以上传这些压缩文件(压缩后)和JSON文件,瞧!您构建了映像并将其推送到注册表。

因此,是的,您可以在命令行上使用旧的tar创建这些tarball,使用文本编辑器创建一些JSON文件,然后使用curl将它们上传到注册表。我以前做过。当然,为了使任何容器运行时都能够实际运行这样的映像,您的tarball可能需要包含一些最低限度的框架文件和目录才能正确运行,例如,作为Linux系统(实际上不是很多)。但是,压缩包的内容没有任何限制。他们甚至不必是有效的tar存档。 (是的,您可以滥用容器注册表来上载任何垃圾数据。例如,this shell script将40MB的随机字节上载到Docker Hub。)您仍然可以使用JSON元数据文件声明您的(完全损坏)“图片”由这些垃圾BLOb组成。 (当然,这样的映像将无法在运行时运行。)