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

标签 java docker maven jib maven-jib

在过去的几个月里,我一直在试验 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通过阅读它的作品 source code但是当你运行 jib:build 时,两者都没有让我了解幕后发生的事情。 .
如果有人分享更多关于 jib maven 插件以及它如何在不使用 docker 守护程序的情况下在幕后实际构建和推送图像,我将不胜感激。

最佳答案

(这里是Jib dev。我将在非常高的层次上非常轻松地触及这个主题,并且只是概念上的。请记住,以下内容仅涵盖图像构建的一个方面。)
从概念上讲,容器镜像的结构非常简单;它只是一个压缩包的集合,加上一些关于图像的元数据(大约两个 JSON 文件)。如果您以有序的方式解压缩一些 tarball( union mounting ,具体而言),您会得到一些文件和目录;这些基本上是您将在运行时获得和看到的图像的文件系统内容。在场景中放入几个小的 JSON 文件以获取有关图像的一些元数据(例如,运行时的环境变量、图像入口点、该图像由哪个 tarball 组成等),您就已经拥有了一个容器图像.然后,您通过 Docker Registry API 与容器注册表进行通信。 (即,发送和接收 HTTP 请求和响应)上传那些 tarball(压缩后)和 JSON 文件,瞧!您构建了一个镜像并将其推送到注册表。
所以,是的,您可以使用旧的 tar 创建这些 tarball。在命令行上,使用文本编辑器创建一些 JSON 文件,然后使用 curl 将它们上传到注册表。 .我以前这样做过。当然,为了让任何容器运行时能够实际运行这样的镜像,您的 tarball 可能需要包含一些最低限度要求的骨架文件和目录才能正常运行,例如,作为 Linux 系统(实际上并不多)。但是,tarball 的内容没有限制;它们甚至不必是有效的 tar 存档。 (是的,您可以滥用容器注册表来上传任何垃圾数据。例如,this shell script 将 40MB 的随机字节上传到 Docker Hub。)而且您仍然可以使用 JSON 元数据文件声明您的(完全损坏的)“图像”由这些垃圾 BLOb 组成。 (当然,这样的镜像在运行时将无法运行。)

关于java - Jib maven 插件如何在不使用 docker 守护进程的情况下构建镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64104769/

相关文章:

docker - "docker images ls"和 "docker image ls"有什么区别?

docker redis 备份

javax.xml.bind.JAXBException : doesn't contain ObjectFactory. 类 o jaxb.in​​dex

java - cometd jar 和 jetty jar 之间有兼容性表吗?

java - 如何在 android studio 中使用开关小部件使 function() 启用/禁用?

java - 如何提高 SWT 绘图性能?

java - Android - 使用线程

python - Dockerfile RUN 命令返回 "No such file or directory"

java - 为什么我在 pom.xml 的第 1 行出现未知错误?

java - 由于 Maven 依赖关系,Map、List 不是通用的且 isEmpty 函数未定义