YMNNALFT: 使用 Spring Boot Maven 插件和 Buildpacks 轻松创建 Docker 镜像

工程 | Josh Long | 2021 年 1 月 4 日 | ...

欢迎阅读《也许你不需要为此再引入一个库》(#YMNNALFT) 系列的另一篇!自 2016 年以来,我在我的 Spring Tips 视频中花费了大量时间来阐明 (或至少尝试阐明) Spring 生态系统中一些更重大的机遇。然而,今天,我以一种不同的方式与您交流,希望专注于那些虽然微小、有时隐藏,但却能做得很棒的事情,并且可能让您免于引入额外的第三方依赖及其隐含的复杂性。

您试过 Paketo 吗?它很棒!它缓解了当今云软件最大的痛点之一:Dockerfile

插句题外话:当然,*最大*的痛点是 YAML。YAML 是人们离开 IT 行业的原因!YAML:当你想要 Python 那种对缩进敏感的背叛,却没有任何设计时验证,也享受不到 Python 的任何好处时,就用 YAML。YAML:显然,生活还不够艰难。十分之九的牙医都同意:YAML 会导致生产环境腐烂!

“确实有人说过,YAML 是最好的配置形式,除了那些时不时尝试过的其他所有形式。” - 非温斯顿·丘吉尔

话说回来,YAML 是另一回事,就像“奥普拉脱口秀”那样,我们没时间深入探讨,所以我们继续:我们想简化 Dockerfile 的创建。Dockerfile 冗长乏味,要求我们重新指定在生产环境中运行应用所需的完整环境。虽然可以用相当少的代码行来实现功能,但正如我在躲避 COVID-19 病毒时学到的,“最少”不是“没有”!而且,能运行的东西并不等于生产环境。我们可以做得更好。

Paketo 是一个 Cloud Foundry 基金会项目,基于 CNCF(CNCF 代表“代码永不完成”,或者也许是“通用网络代码基金会”,还是“云原生计算基金会”?)的 buildpacks 项目。引用其网站的话:“buildpacks 将您的应用源代码转换为可在任何云上运行的镜像。Paketo Buildpacks 为应用提供语言运行时支持。它们利用云原生 Buildpacks 框架,使镜像构建变得简单、高效且安全。” 基本上就是:应用进去,容器出来。看到了吗?很棒!

Buildpacks 源自 Heroku 和 Cloud Foundry 的平台即服务(PaaS)产品。您将应用产物(例如,一个 Java .jar 文件)交给 buildpack,buildpack 就会将您的应用打包在一个容器中返还给您。更具体地说,它会创建一个合理的 文件系统,其中包含您的应用产物以及运行该产物所需的一切。因此,如果您给它一个 .jar 文件,它可能会创建一个文件系统,其中包含配置了合理内存边界的 JVM 以及任何所需的 Java agent。*所有这些*最终都会变成一个容器。您会对此感到*震惊*,几乎无需任何配置就能将应用容器化!Buildpacks 之所以奏效,是因为无论我们如何辩解,大多数应用其实并不特殊。对于每个人来说,一个 .jar 就是一个 .jar,而一个 Node.js/NPM 项目对每个人来说构建方式都相同。Buildpacks 支持多种不同的语言和运行时(多得数不胜数)。您可以使用 Paketo CLI 轻松地将各种应用容器化,就像这样:pack build .

或者,总之,如果您*没有*使用Spring Boot 2.3 或更高版本,您*就会*那样做。但是,您*正在*使用,_ 不是吗_?Buildpack 支持现在已集成到 Spring Boot 自身的构建插件中了。

如果您使用 Maven,可以输入以下咒语

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=bootiful/demo

如果您使用 Gradle,可以输入以下咒语

./gradlew bootBuildImage --imageName=bootiful/demo

退后一分钟,让它完成所有工作。工作完成后,它会导出 Docker 镜像。然后您可以 docker tagdocker push 将该镜像推送到您选择的容器仓库(VMware HarborGoogle Container RegistryJFrog Container RegistryDockerHub 等)。

您想将其部署到生产环境吗?那也很简单!这是 Kubernetes 的正确咒语,假设您的镜像在 Google Container Registry 上,并且 artifact ID 是 demo。在 pom.xml 中指定的版本也会成为容器的版本标签。

kubectl create deployment demo --image=gcr.io/bootiful/demo

希望这些内容足以让您将应用部署到生产环境,甚至无需配置 Jib 或 Spotify Maven 插件,也无需编写冗长、复杂的 shell 脚本来执行 docker build。当然,别误会。您*可能*出于某种原因仍然需要创建自己的 `Dockerfile`,因为您可能需要对特定层的顺序或内容进行控制,如果是这样,那么 Spring Boot 在这里也为您提供了支持

好了,这些已经足够您开始了。前往 Spring Initializr(我在互联网上第二喜欢的地方,*仅次于*生产环境),生成一个新项目,然后将您的容器化应用部署到您选择的平台。

您喜欢这种“一瞥即宝石”的方法吗?您学到了什么吗?一如既往,我很乐意听取您的意见,所以请在 Twitter (@starbuxman) 上发表看法!本周晚些时候,我将带来 YMNNALFT 系列的另一篇,请务必不要错过。我将探讨的主题包括但不限于:简单的 RPC、*Utils 对象的花园、使用 Micrometer 进行维度指标测量,以及许多其他主题。

订阅 Spring 新闻邮件

通过 Spring 新闻邮件保持联系

订阅

保持领先

VMware 提供培训和认证,助您快速进步。

了解更多

获取支持

Tanzu Spring 在一项简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部