在过去的几个月里,我一直在试用Docker,并享受在容器中构建和运行java应用程序的好处。
几周前,我偶然发现了jib maven plugin,并注意到jib可以在不使用docker守护进程的情况下为docker注册表构建映像。
将jib添加到我的一个项目并运行mvn clean install jib:build
(在没有安装docker的VM上)后,我惊讶地发现jib实际上构建了一个包含我的项目的映像并将其推送到远程注册表。
出于好奇,我上网阅读了更多关于jib如何在没有安装docker的情况下构建和推送docker图像的信息,但发现几乎没有关于这个主题的信息。我设法找到了一个article,它解释了一些不使用docker创建图像的方法,并试图通过阅读它来理解maven目标jib:build
是如何工作的。s source code,但这两个都没有让我深入了解运行jib:build
时场景背后发生了什么。
如果有人能分享更多关于jib maven插件的信息,以及它是如何在不使用docker守护进程的情况下在幕后构建和推送图像的,我将非常感激。
1条答案
按热度按时间irlmq6kh1#
(Jib dev在这里。我将在一个非常高的层次上非常轻微地触及这个主题,而且只在概念上。请记住,以下内容只涵盖了形象构建的一个方面。)
概念上,容器图像的剖析非常简单;它只是一个tarball集合,加上一些关于图像的元数据(大约两个JSON文件),如果您有序地解压缩一些tarball(具体来说是union mounting),您将得到一些文件和目录;这些基本上是映像的文件系统内容,您将在运行时获得并看到这些内容。在场景中加入一些小JSON文件,以获取映像的元数据(例如,运行时的环境变量、映像入口点、映像由哪些tarball组成等),这样您就已经拥有了一个容器映像。然后,通过Docker Registry API与容器注册中心通信(即发送和接收HTTP请求和响应),上传压缩后的tarball和JSON文件,瞧!您构建了一个映像并将其推送到注册中心。
因此,可以在命令行上使用
tar
创建这些tarball(这些tarball被称为“图像层”),用文本编辑器创建一些JSON文件,并使用curl
将它们上传到注册表中,我以前也这样做过,当然,为了使任何容器运行时都能够实际运行这样的图像,你的tarball可能需要包含一些最低限度的框架文件和目录才能正常工作,例如,作为一个Linux系统(实际上不是很多)。它们甚至不必是有效的tar存档。(是的,您可以滥用容器注册表来上载任何垃圾数据。例如,这个shell脚本将40 MB的随机字节上载到Docker Hub。)并且您仍然可以使用JSON元数据文件声称您的(完全损坏的)“映像”是由这些垃圾BLOb组成的。(当然,这样的映像在运行时将无法运行。)