4

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

几周前,我偶然发现了jib maven 插件,并注意到 jib 可以在不使用 docker daemon 的情况下将映像构建到 docker 注册表。

在将 jib 添加到我的一个项目并运行后mvn clean install jib:build(在没有安装 docker 的 VM 上),我很惊讶 jib 实际构建了包含我的项目的图像并将其推送到远程注册表。

出于好奇,我上网阅读了有关 jib 如何在没有安装 docker 的情况下构建和推送 docker 映像的更多信息,但几乎没有找到关于该主题的信息。我设法找到了一篇文章,它解释了几种不使用 docker 创建图像的方法,并且还试图jib:build通过阅读它的源代码来理解 maven 目标是如何工作的,但是两者都没有让我对运行时场景背后发生的事情有任何见解jib:build.

如果有人分享更多关于 jib maven 插件以及它如何在不使用 docker 守护进程的情况下在幕后实际构建和推送图像的信息,我将不胜感激。

4

1 回答 1

8

(这里是 Jib dev。我将在非常高的层次上非常轻松地讨论这个主题,并且只是在概念上。请记住,以下内容仅涵盖图像构建的一个方面。)

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

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

于 2020-09-28T20:11:57.560 回答