当前位置: 首页 > 知识库问答 >
问题:

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

申博厚
2023-03-14

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

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

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

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

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

共有1个答案

顾炎彬
2023-03-14

(这里是jib dev。我将在一个非常高的层次上轻轻地触及这个主题,而且只是概念上的。请记住,以下仅涵盖图像构建的一个方面。)

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

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

 类似资料:
  • 我已经按照这些教程为我的Spring Boot应用程序构建Docker映像,该应用程序使用Maven作为构建工具。我正在Windows10机器上使用boot2docker VM,将我的项目从Bitbucker存储库克隆到VM。 > 使用用于DockerFile的Spotify maven插件。尝试运行./mvnw来构建JAR和Docker映像。但是,我没有在boot2docker中安装Java。因

  • 问题内容: 在Google上搜索会发现x2代码段。第一个结果是该代码配方的内容,其中包含大量文档和说明,并在下面进行了一些有用的讨论。 但是,另一个代码示例虽然没有包含太多文档,但包含用于传递命令(例如启动,停止和重新启动)的示例代码。它还会创建一个PID文件,可以方便地检查守护程序是否已在运行等。 这些示例都说明了如何创建守护程序。还有其他需要考虑的事情吗?一个样本比另一个样本好吗,为什么? 问

  • 问题内容: 我正在开发一个网站,用户使用ajax,php和POST方法提交凭据,我想保护登录凭据的格式不是纯文本,但我不想使用SSL我可以在不使用SSL证书的情况下保护密码凭据吗? 谁能给我任何方法的工作示例? 问题答案: 没有一些通道外验证(SSL提供),您将无法完全保护凭据。一个在中间攻击的人永远是可能的。 简而言之,客户端无法完全确定他们正在与服务器通信,而不是在两者之间插入假服务器。

  • Gradle守护进程是一个常驻构建进程.在两个构建之间的空闲期间会等待着下次构建.与每个构建加载Gradle到内存相比,对于多个构建只需要加载一次Gradle到内存具有明显的好处.这本身就是对性能的显著优化,但是不止这些. 现代JVM的显著优化是运行时代码优化.例如,热点(HotSpot)(由Oracle提供并作为OpenJDK的基础的JVM实现)适用于优化运行时代码.优化是渐进的,而不是瞬间的。

  • 问题内容: 如何在Java程序中打开和关闭调试?如何在不重新编译Java程序的情况下打开和关闭调试? 问题答案: 无需使用IDE进行调试 1)您可以使用Assertions编写Java程序。您随时可以启用/禁用它们。 2)您可以使用配置了log4j.properties的日志。在Java程序中,您可以随时指定信息和调试日志,只要您想显示调试或信息日志等信息,就可以在log4j.properties

  • 我需要为我的项目生成序列图。 我已经创建了类、具有适当签名的方法、从一个类到另一个类的方法调用等,但是,由于逻辑还没有实现,我无法真正运行web应用程序来通过跟踪获得序列图。 语言:Java IDE:Eclipse