Dockerfiles

雖然只需在 Dockerfile 中加入幾行程式碼即可將 Spring Boot uber jar 轉換為 Docker 映像檔,但我們將使用分層功能來建立最佳化的 Docker 映像檔。當您建立包含層索引檔案的 jar 時,spring-boot-jarmode-tools jar 將作為依賴項新增到您的 jar 中。有了這個位於類別路徑上的 jar,您就可以以特殊模式啟動您的應用程式,允許啟動程式碼執行與您的應用程式完全不同的程式碼,例如,提取圖層的程式碼。

tools 模式不能與包含啟動指令碼的完全可執行的 Spring Boot 封存檔一起使用。建置要用於 layertools 的 jar 檔案時,請停用啟動指令碼配置。

以下是如何使用 tools jar 模式啟動您的 jar 的方法

$ java -Djarmode=tools -jar my-app.jar

這將提供以下輸出

Usage:
  java -Djarmode=tools -jar my-app.jar

Available commands:
  extract      Extract the contents from the jar
  list-layers  List layers from the jar that can be extracted
  help         Help about any command

extract 命令可用於輕鬆地將應用程式分割成要新增到 Dockerfile 的圖層。以下是一個使用 jarmode 的 Dockerfile 範例。

FROM bellsoft/liberica-runtime-container:jre-17-cds-slim-glibc as builder
WORKDIR /builder
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted

FROM bellsoft/liberica-runtime-container:jre-17-cds-slim-glibc
WORKDIR /application
COPY --from=builder /builder/extracted/dependencies/ ./
COPY --from=builder /builder/extracted/spring-boot-loader/ ./
COPY --from=builder /builder/extracted/snapshot-dependencies/ ./
COPY --from=builder /builder/extracted/application/ ./
ENTRYPOINT ["java", "-jar", "application.jar"]

假設上述 Dockerfile 位於目前目錄中,您可以使用 docker build . 建置您的 Docker 映像檔,或者選擇性地指定應用程式 jar 的路徑,如下例所示

$ docker build --build-arg JAR_FILE=path/to/myapp.jar .

這是一個多階段 Dockerfile。建置器階段會提取稍後需要的目錄。每個 COPY 命令都與 jarmode 提取的圖層相關。

當然,也可以在不使用 jarmode 的情況下編寫 Dockerfile。您可以使用 unzipmv 的組合將檔案移動到正確的圖層,但 jarmode 簡化了這個過程。此外,jarmode 建立的佈局可以直接支援 CDS。