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 镜像可以使用docker build .构建,或者可以选择指定应用程序 jar 的路径,如下例所示

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

这是一个多阶段 Dockerfile。构建阶段提取了稍后需要的目录。每个COPY命令都与 jarmode 提取的层相关联。

当然,Dockerfile 可以不使用 jarmode 编写。您可以使用unzipmv的组合将文件移动到正确的层,但 jarmode 简化了这一过程。此外,jarmode 创建的布局开箱即用地支持 CDS。