java - Jib maven 插件如何在不使用 docker 守护进程的情况下构建图像?
问题描述
在过去的几个月里,我一直在试验 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 守护进程的情况下在幕后实际构建和推送图像的信息,我将不胜感激。
解决方案
(这里是 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 组成的。(当然,这样的图像在运行时将无法运行。)
推荐阅读
- python - 如何根据python中每一行的前一个数字将两个文件连接在一起
- node.js - Ionic 4.0.2 无法启动空白项目
- symfony - Doctrine make:migration 未知数据库类型
- dart - 如何在 Flutter 中发送带有附件的邮件?
- rest - RESTful API 按类型或 id 访问子资源
- asp.net - 配置方法startup.cs asp.net core
- rest - 谷歌设备认证后转发用户
- azure - Azure 逻辑应用失败条件
- api - 如何在 Java 8 流 api foreach 中继续或中断
- azure - 为 VM 扩展自定义 Linux WAagent