◀返回
將原生可執行檔容器化並在容器中執行
容器提供彈性的開發環境以匹配生產環境,幫助隔離您的應用程式並最小化額外負擔。對於使用 GraalVM Native Image 生成的自包含可執行檔,容器是顯而易見的部署選擇。
為了支援基於容器的開發,有多種 GraalVM 容器映像可用,具體取決於平台、架構、Java 版本和版本。
- Oracle GraalVM 容器映像,可在 Oracle 容器註冊表 (OCR) 中找到,並遵循 GraalVM 免費條款和條件 (GFTC) 授權。
- GraalVM 社群版容器映像發佈在 GitHub 容器註冊表 中。
本指南將示範如何為您的 Java 應用程式容器化原生可執行檔。您將使用具有 Native Image 的 GraalVM 容器映像,將 Java 應用程式提前編譯成原生可執行檔。
下載範例應用程式
本指南使用 Spring Boot 3 Native Image 微服務範例。此範例是一個基於 Spring Boot 3 建構的最小 REST API 應用程式。如果您呼叫 HTTP 端點 /jibber
,它將返回一些由 Lewis Carroll 以 Jabberwocky 詩風格生成的無意義詩句。
先決條件
請確保您已安裝 GraalVM JDK。最簡單的入門方式是使用 SDKMAN!。如需其他安裝選項,請訪問下載章節。
-
安裝並執行與 Docker API 相容的容器運行時,例如 Rancher Desktop、Docker 或 Podman。
- 複製 GraalVM Demos 儲存庫
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 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 映像等小型容器中來建置靜態連結的原生可執行檔。