在过去的几个月里,我一直在尝试docker,并享受在容器中构建和运行java应用程序的好处。
几周前,我偶然发现了jib-maven插件,并注意到jib可以在不使用docker守护进程的情况下构建镜像到docker注册表。
在将jib添加到我的一个项目并运行mvn clean install jib:build
(在没有安装docker的VM上(后,我很惊讶jib居然构建了一个包含我的项目的映像并将其推送到远程注册表。
出于好奇,我上网阅读了更多关于jib如何在没有安装docker的情况下构建和推送docker图像的信息,但几乎没有发现关于这个主题的信息。我设法找到了一篇文章,解释了在不使用docker的情况下创建图像的几种方法,并试图通过阅读其源代码来理解maven目标jib:build
是如何工作的,但这两篇文章都没有让我深入了解运行jib:build
时场景背后发生了什么。
如果有人能分享更多关于jib-maven插件的信息,以及它是如何在不使用docker守护进程的情况下在幕后构建和推送图像的,我将不胜感激。
从概念上讲,容器图像的解剖结构非常简单;它只是一个tarball的集合,加上一些关于图像的元数据(关于两个JSON文件(。你会发现,如果你以有序的方式解开一些tarball(具体来说是联合挂载(,你会留下一些文件和目录;这些基本上是您将在运行时获得和看到的映像的文件系统内容。在场景中放入几个小JSON文件,以获取有关图像的一些元数据(例如,运行时的环境变量、图像入口点、该图像由哪个tarball组成等(,您就已经有了一个容器图像。然后,您通过Docker registry API与容器注册表通信(即发送和接收HTTP请求和响应(,上传这些tarball(压缩后(和JSON文件,瞧!您构建了一个映像并将其推送到注册表。
因此,是的,您可以在命令行上使用旧的tar
创建这些tarball(这些tarball被称为"图像层"(,使用文本编辑器创建一些JSON文件,并使用curl
将它们上传到注册表。我以前也这样做过。当然,为了让任何容器运行时都能够真正运行这样的映像,您的tarball可能需要包括一些最低要求的骨架文件和目录,以正确运行,例如,作为Linux系统(实际上并不多(。但是,油布球的含量仍然没有限制;它们甚至不必是一个有效的tar档案。(是的,你可以滥用容器注册表来上传任何垃圾数据。例如,这个shell脚本将40MB的随机字节上传到Docker Hub。(你仍然可以用JSON元数据文件声称你的(完全损坏的(";图像";由这些垃圾BLOb组成。(当然,这样的图像在运行时将无法运行。(