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。您可以使用 unzip
和 mv
的組合將檔案移動到正確的圖層,但 jarmode 簡化了這個過程。此外,jarmode 建立的佈局可以直接支援 CDS。