◀返回
将原生可执行文件容器化并在容器中运行
容器提供了开发环境与生产环境保持一致的灵活性,有助于隔离您的应用程序并最大限度地减少开销。对于使用 GraalVM Native Image 生成的自包含可执行文件,容器是显而易见的部署选择。
为了支持基于容器的开发,有多种 GraalVM 容器镜像可用,具体取决于平台、架构、Java 版本和版本。
- Oracle GraalVM 容器镜像在 Oracle Container Registry (OCR) 中可用,受 GraalVM 免费条款和条件 (GFTC) 许可约束。
- GraalVM 社区版容器镜像发布在 GitHub Container Registry。
本指南将展示如何将 Java 应用程序的原生可执行文件容器化。您将使用包含 Native Image 的 GraalVM 容器镜像,将 Java 应用程序提前编译为原生可执行文件。
下载示例应用程序
本指南使用 Spring Boot 3 Native Image 微服务示例。该示例是一个基于 Spring Boot 3 构建的最小化 REST API 应用程序。如果您调用 HTTP 端点 /jibber
,它将返回一些以刘易斯·卡罗尔的《Jabberwocky》诗歌风格生成的无意义诗句。
前提条件
确保您已安装 GraalVM JDK。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问下载部分。
-
安装并运行 Docker API 兼容的容器运行时,例如 Rancher Desktop、Docker 或 Podman。
- 克隆 GraalVM Demos 仓库
git clone https://github.com/graalvm/graalvm-demos.git
- 导航到示例目录
cd graalvm-demos/native-image/spring-boot-microservice-jibber
构建并作为原生可执行文件运行
借助 Spring Boot 3 对 GraalVM Native Image 的内置支持,将 Spring Boot 3 应用程序编译为原生可执行文件变得更加容易。
- 构建原生可执行文件
./mvnw native:compile -Pnative
-Pnative
配置文件用于为您的平台生成原生可执行文件。这将在 target/ 目录中生成一个名为 benchmark-jibber 的原生可执行文件。 - 运行原生可执行文件,并通过添加
&
将其置于后台./target/benchmark-jibber &
- 使用
curl
调用端点curl https://: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 https://: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 容器之类的微小容器中。