返回

將原生可執行檔容器化並在容器中執行

容器提供彈性的開發環境以匹配生產環境,幫助隔離您的應用程式並最小化額外負擔。對於使用 GraalVM Native Image 生成的自包含可執行檔,容器是顯而易見的部署選擇。

為了支援基於容器的開發,有多種 GraalVM 容器映像可用,具體取決於平台、架構、Java 版本和版本。

本指南將示範如何為您的 Java 應用程式容器化原生可執行檔。您將使用具有 Native Image 的 GraalVM 容器映像,將 Java 應用程式提前編譯成原生可執行檔。

下載範例應用程式

本指南使用 Spring Boot 3 Native Image 微服務範例。此範例是一個基於 Spring Boot 3 建構的最小 REST API 應用程式。如果您呼叫 HTTP 端點 /jibber,它將返回一些由 Lewis Carroll 以 Jabberwocky 詩風格生成的無意義詩句。

先決條件

請確保您已安裝 GraalVM JDK。最簡單的入門方式是使用 SDKMAN!。如需其他安裝選項,請訪問下載章節

  1. 安裝並執行與 Docker API 相容的容器運行時,例如 Rancher DesktopDockerPodman

  2. 複製 GraalVM Demos 儲存庫
     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 https://#: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 https://#: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 映像等小型容器中來建置靜態連結的原生可執行檔。

與我們聯繫