【问题标题】:How does the Jib maven plugin build images without using a docker daemon?Jib maven 插件如何在不使用 docker 守护进程的情况下构建图像?
【发布时间】:2021-01-14 04:32:10
【问题描述】:

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

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

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

出于好奇,我上网阅读了有关 jib 如何在未安装 docker 的情况下构建和推送 docker 映像的更多信息,但几乎没有找到关于该主题的信息。我设法找到了一个article,它解释了几种不使用docker创建图像的方法,还试图通过阅读它的source code来理解maven目标jib:build的工作原理,但两者都没有给我任何关于正在发生的事情的见解当你运行jib:build时,在幕后。

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

【问题讨论】:

    标签: java docker maven jib maven-jib


    【解决方案1】:
    推荐的答案 Google Cloud

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

    从概念上讲,容器图像的结构非常简单;它只是一个 tarball 的集合,加上一些关于图像的元数据(大约两个 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 组成。 (当然,这样的镜像在运行时会运行失败。)

    【讨论】:

    • 嘿@Chanseok 哦,谢谢你的回复!您在此处提供的高级概述甚至在 jib maven 插件之外也很有用:)
    • 问题:我们可以在使用 jib 时停止将图像推送到任何注册表吗?在 CI 管道中,我们不需要它(代码尚未合并,因此即使对于我们公司的内部注册表,图像也无用)。 buildTar 有时不是一个选项(我们的管道检查我们在目标目录中有多少文件,但它失败了,因为使用 buildTar,我们有 id、digest、json 和 tar,它们太多了。
    • @WesternGun 那么为什么要运行 Jib 目标呢?如果您根本不需要在任何地方(无论是在注册表、本地 Docker 守护程序还是文件系统中)物理实现映像,那么运行 Jib 有什么意义?
    • NVM。我们的 CI 团队说它可以上传到 CI 注册表而无需担心开销,所以无论如何我都会上传。但我认为丢弃工件仍然是对 jib 的有效要求,在这种情况下,最接近的目标可能是 buildTar;我只需要通过管道。这里的用例是,如果代码仍在审查中并且没有合并到 master 中,因此任何人都不需要图像,只需要通过 CI,并且您不能轻易更改 CI 配置。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2020-07-26
    • 2020-07-06
    • 2016-11-21
    • 2016-04-05
    • 2021-11-13
    • 2019-06-12
    • 2022-08-18
    相关资源
    最近更新 更多