当前位置: 首页 > 工具软件 > Buildpacks > 使用案例 >

SpringBoot 2 与 Docker - Buildpacks

吕永寿
2023-12-01

Spring Boot Maven 和 Gradle 插件使用 builcpack 的方式与以下实例中的 pack 命令行完全相同。主要区别在于,插件使用 docker 来运行构建,而 pack 则不需要。给定相同的输入,结果镜像相同。

Cloud Foundry 多年来一直在内部使用容器,用于将用户代码转换为容器的技术的一部分是 Build Packs,该思想最初是借鉴了 Heroku。当前的 buildpacks(v2)生成通用二进制输出,该输出由平台组装到容器中。新一代的 buildpack(v3)是 Heroku 与其他公司(包括 Pivotal)之间的合作,可以直接且显式地构建容器镜像。这对于开发人员和操作员而言非常有趣。开发人员不需要太在意如何构建容器的细节,但是如果需要,他们可以轻松地创建一个容器。Buildpacks 还具有许多用于缓存构建结果和依赖项的功能,因此,Buildpack 的运行速度要比本地 Docker 构建快得多。操作员可以扫描容器以审核其内容并进行转换以修补它们以进行安全更新。我们可以在本地运行构建包(例如,在开发人员机器上或在 CI 服务中),也可以在 Cloud Foundry 之类的平台上运行。

buildpack 生命周期的输出是一个容器镜像,但是我们不需要 docker 或 Dockerfile,因此 CI 和自动化友好。输出镜像中的文件系统层由 buildpack 进行控制,通常,将进行许多优化而无需开发人员知道或关心它们。在较低层(如包含操作系统的基础镜像)与较高层(如包含中间件和特定于语言的依赖关系)之间还有一个应用二进制接口。如果存在安全更新,则 Cloud Foundry 这样的平台可以修补较低的层,而不会影响应用的完整性和功能。

为了让我们了解 buildpack 的功能,这里是从命令行使用 Pack 命令行的示例(它将与我们在该指南中使用的示例应用一起使用,无需 Dockerfile 或任何特殊的构建配置):

$ pack build myorg/myapp --builder=cloudfoundry/cnb:bionic --path=.
2018/11/07 09:54:48 Pulling builder image 'cloudfoundry/cnb:bionic' (use --no-pull flag to skip this step)
2018/11/07 09:54:49 Selected run image 'packs/run' from stack 'io.buildpacks.stacks.bionic'
2018/11/07 09:54:49 Pulling run image 'packs/run' (use --no-pull flag to skip this step)
*** DETECTING:
2018/11/07 09:54:52 Group: Cloud Foundry OpenJDK Buildpack: pass | Cloud Foundry Build System Buildpack: pass | Cloud Foundry JVM Application Buildpack: pass
*** ANALYZING: Reading information from previous image for possible re-use
*** BUILDING:
-----> Cloud Foundry OpenJDK Buildpack 1.0.0-BUILD-SNAPSHOT
-----> OpenJDK JDK 1.8.192: Reusing cached dependency
-----> OpenJDK JRE 1.8.192: Reusing cached launch layer

-----> Cloud Foundry Build System Buildpack 1.0.0-BUILD-SNAPSHOT
-----> Using Maven wrapper
       Linking Maven Cache to /home/pack/.m2
-----> Building application
       Running /workspace/app/mvnw -Dmaven.test.skip=true package
...
---> Running in e6c4a94240c2
---> 4f3a96a4f38c
---> 4f3a96a4f38c
Successfully built 4f3a96a4f38c
Successfully tagged myorg/myapp:latest
$ docker run -p 8080:8080 myorg/myapp
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.5.RELEASE)

2018-11-07 09:41:06.390  INFO 1 --- [main] hello.Application: Starting Application on 1989fb9a00a4 with PID 1 (/workspace/app/BOOT-INF/classes started by pack in /workspace/app)
...

--builder 试运行 buildpack 生命周期的 docker 镜像 - 通常,它将是所有开发人员或单个平台上所有开发人员的共享资源。我们可以在命令行上设置默认构建器(在 ~/.pack 中创建一个文件),然后从后续构建中省略该标志。

cloudfoundry/cnb:bionic 构建器还知道如何从可执行 jar 文件构建镜像,因此我们可以先使用 mvnw 进行构建,然后将 --path 指向 jar 文件以得到相同的结果。

 类似资料: