返回

将原生可执行文件容器化并在容器中运行

容器提供开发环境的灵活度,以匹配生产环境,帮助隔离应用程序,并最大限度地减少开销。对于使用 GraalVM Native Image 生成的自包含可执行文件,容器是一个明显的部署选择。

为了支持基于容器的开发,根据平台、架构、Java 版本和版本,提供了几种 GraalVM 容器镜像。

本指南展示了如何为您的 Java 应用程序容器化原生可执行文件。您将使用包含 Native Image 的 GraalVM 容器镜像来提前编译 Java 应用程序以生成原生可执行文件。

下载示例应用程序

本指南使用 Spring Boot 3 Native Image 微服务示例。该示例是一个基于 REST 的最小 API 应用程序,构建在 Spring Boot 3 之上。如果您调用 HTTP 端点 /jibber,它将返回一些以路易斯·卡罗尔的《Jabberwocky》诗歌风格生成的无意义诗句。

先决条件

确保您已安装 GraalVM JDK。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问 下载部分

  1. 安装并运行与 Docker-API 兼容的容器运行时,例如 Rancher DesktopDockerPodman

  2. 克隆 GraalVM 演示存储库
     git clone https://github.com/graalvm/graalvm-demos
    
  3. 将目录更改为 spring-native-image/
     cd spring-native-image
    

构建并作为原生可执行文件运行

利用 Spring Boot 3 中对 GraalVM Native Image 的内置支持,编译 Spring Boot 3 应用程序为原生可执行文件变得更加容易。

  1. 构建原生可执行文件
     ./mvnw native:compile -Pnative
    

    -Pnative 配置文件用于为您的平台生成原生可执行文件。这将在 target/ 目录中生成一个名为 benchmark-jibber 的原生可执行文件。

  2. 运行原生可执行文件并通过追加 & 将其放入后台
     ./target/benchmark-jibber &
    
  3. 使用 curl 调用端点
     curl http://localhost:8080/jibber
    

    您应该会得到一个随机的无意义诗句。

  4. 使用 fg 将应用程序带到前台,然后输入 <CTRL-c> 以停止应用程序。

容器化原生可执行文件

生成的原生可执行文件是平台相关的。

  1. 使用以下命令容器化原生可执行文件

    • 在 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 .
      
  2. 运行应用程序
     docker run --rm --name native -p 8080:8080 jibber-benchmark:native.0.0.1-SNAPSHOT
    
  3. 从新的终端窗口中,使用 curl 调用端点
     curl http://localhost:8080/jibber
    

    它应该会生成一个随机的无意义诗句。

  4. 要停止应用程序,首先使用 docker ps 获取容器 ID,然后运行
     docker rm -f <container_id>
    
  5. 要删除容器镜像,首先使用 docker images 获取镜像 ID,然后运行
     docker rmi -f <image_1_id> <image_n_id>
    

总结

在本指南中,您了解了如何使用 GraalVM 容器镜像为您的 Java 应用程序容器化原生可执行文件。

使用 GraalVM Native Image,您可以通过将原生可执行文件直接打包到小型容器(例如 scratch 或 distroless 镜像)中来构建静态链接的原生可执行文件。

联系我们