Dockerfiles

虽然仅通过 Dockerfile 中的数行内容就可以将 Spring Boot uber jar 转换为 docker 映像,但我们将使用 layering feature 创建优化的 docker 映像。当你创建包含层索引文件的 jar 时,spring-boot-jarmode-layertools jar 将作为依赖项添加到你的 jar 中。通过使用 classpath 中的此 jar,你可以在特殊模式下启动你的应用程序,该模式允许引导代码运行与你的应用程序完全不同的内容,例如,提取层的内容。

layertools`模式无法与包含启动脚本的 fully executable Spring Boot archive 一起使用。在构建旨在与 `layertools 一起使用的 jar 文件时,禁用启动脚本配置。

以下是使用 `layertools`jar 模式的启动 jar 的方法:

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

这将提供以下输出:

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

Available commands:
  list     List layers from the jar that can be extracted
  extract  Extracts layers from the jar for image creation
  help     Help about any command

extract 命令可用于轻松将应用程序拆分成要添加到 Dockerfile 的层。以下是一个使用 jarmode 的 Dockerfile 示例。

FROM eclipse-temurin:17-jre as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

FROM eclipse-temurin:17-jre
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]

假定上述 Dockerfile 在当前目录中,则可以使用 docker build . 构建你的 docker 映像,或选择指定你的应用程序 jar 的路径,如下例中所示:

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

这是一个多阶段 dockerfile。builder 阶段会提取之后需要使用的目录。每个 COPY 命令都与通过 jarmode 提取的层相关。

当然,可以在不使用 jarmode 的情况下编写 Dockerfile。你可以使用 unzipmv 的某种组合将内容移到右侧层,但 jarmode 可简化此操作。