◀返回
将原生可执行文件容器化并在容器中运行
容器提供开发环境的灵活度,以匹配生产环境,帮助隔离应用程序,并最大限度地减少开销。对于使用 GraalVM Native Image 生成的自包含可执行文件,容器是一个明显的部署选择。
为了支持基于容器的开发,根据平台、架构、Java 版本和版本,提供了几种 GraalVM 容器镜像。
- Oracle GraalVM 容器镜像,可在 Oracle 容器注册表 (OCR) 中获得,根据 GraalVM 免费条款和条件 (GFTC) 许可。
- 发布在 GitHub 容器注册表 中的 GraalVM 社区版容器镜像。
本指南展示了如何为您的 Java 应用程序容器化原生可执行文件。您将使用包含 Native Image 的 GraalVM 容器镜像来提前编译 Java 应用程序以生成原生可执行文件。
下载示例应用程序
本指南使用 Spring Boot 3 Native Image 微服务示例。该示例是一个基于 REST 的最小 API 应用程序,构建在 Spring Boot 3 之上。如果您调用 HTTP 端点 /jibber
,它将返回一些以路易斯·卡罗尔的《Jabberwocky》诗歌风格生成的无意义诗句。
先决条件
确保您已安装 GraalVM JDK。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问 下载部分。
-
安装并运行与 Docker-API 兼容的容器运行时,例如 Rancher Desktop、Docker 或 Podman。
- 克隆 GraalVM 演示存储库
git clone https://github.com/graalvm/graalvm-demos
- 将目录更改为 spring-native-image/
cd spring-native-image
构建并作为原生可执行文件运行
利用 Spring Boot 3 中对 GraalVM Native Image 的内置支持,编译 Spring Boot 3 应用程序为原生可执行文件变得更加容易。
- 构建原生可执行文件
./mvnw native:compile -Pnative
-Pnative
配置文件用于为您的平台生成原生可执行文件。这将在 target/ 目录中生成一个名为 benchmark-jibber 的原生可执行文件。 - 运行原生可执行文件并通过追加
&
将其放入后台./target/benchmark-jibber &
- 使用
curl
调用端点curl http://localhost:8080/jibber
您应该会得到一个随机的无意义诗句。
- 使用
fg
将应用程序带到前台,然后输入<CTRL-c>
以停止应用程序。
容器化原生可执行文件
生成的原生可执行文件是平台相关的。
-
使用以下命令容器化原生可执行文件
- 在 Linux 上,使用以下命令容器化上一步中生成的原生可执行文件
docker build -f Dockerfiles/Dockerfile.native --build-arg APP_FILE=benchmark-jibber -t jibber-benchmark:native.0.0.1-SNAPSHOT .
- 在 MacOS、Windows 或 Linux 上,使用多阶段 Docker 构建在容器中构建原生可执行文件,并将原生可执行文件打包到轻量级容器镜像中
docker build -f Dockerfiles/Dockerfile -t jibber-benchmark:native.0.0.1-SNAPSHOT .
- 在 Linux 上,使用以下命令容器化上一步中生成的原生可执行文件
- 运行应用程序
docker run --rm --name native -p 8080:8080 jibber-benchmark:native.0.0.1-SNAPSHOT
- 从新的终端窗口中,使用
curl
调用端点curl http://localhost:8080/jibber
它应该会生成一个随机的无意义诗句。
- 要停止应用程序,首先使用
docker ps
获取容器 ID,然后运行docker rm -f <container_id>
- 要删除容器镜像,首先使用
docker images
获取镜像 ID,然后运行docker rmi -f <image_1_id> <image_n_id>
总结
在本指南中,您了解了如何使用 GraalVM 容器镜像为您的 Java 应用程序容器化原生可执行文件。
使用 GraalVM Native Image,您可以通过将原生可执行文件直接打包到小型容器(例如 scratch 或 distroless 镜像)中来构建静态链接的原生可执行文件。