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

How does the Jib maven plugin build images without using a docker daemon?

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

几周前我偶然发现了 jib maven plugin 并注意到 jib 可以在不使用 docker 守护程序的情况下将图像构建到 docker 注册表 .

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

出于好奇,我上网阅读了更多有关 jib 如何在未安装 docker 的情况下构建和推送 docker 图像的信息,但几乎没有找到关于该主题的信息。我设法找到了一个 article which explains a few ways of creating images without using docker and also tried to understand how the maven goal jib:build works by reading it's source code,但是当您 运行 jib:build.

时,这两个都没有让我了解幕后发生的事情

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

(此处为 Jib dev。我将在非常高的层次上仅从概念上轻描淡写地谈及该主题。请记住,以下仅涵盖图像构建的一个方面。)

从概念上讲,容器镜像的结构非常简单;它只是 tar 球的集合,加上一些关于图像的元数据(大约两个 JSON 文件)。如果你以有序的方式取消tar一些tar球(union mounting, to be specific), you are left with some files and directories; these are basically the filesystem contents of an image you'll get and see at runtime. Throw in a couple small JSON files in the scene for some metadata about the image (for example, environment variables at runtime, image entrypoint, which tarballs this image is composed of, etc.), and you already have a container image in your hands. Then, you communicate with a container registry via the Docker Registry API(即发送和接收HTTP请求和响应)上传这些tar球,你会得到它(压缩后)和 JSON 个文件,瞧!您构建了一个映像并将其推送到注册表。

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