org.springframework.boot
spring-boot-maven-plugin
执行 Maven 命令,构建分层的 JAR 包,命令和平时的 Maven 构建命令相同:
$ mvn install
观察 Jar 结构,可以看到里面多了 classpath.idx 与 layers.idx 两个文件:
根据官方介绍,在构建 Docker 镜像前需要从 Jar 中提起出对应的分层文件到 Jar 外面,可用使用下面命令列出可以从分层 Jar 中提取出的文件夹信息:
$ java -Djarmode=layertools -jar target/springboot-layer-0.0.1.jar list
可用该看到以下输出,下面的内容就是接下来使用分层构建后,生成的 Jar 提取出对应资源后的结构:
dependencies
spring-boot-loader
snapshot-dependencies
application
上面即是使用分层工具提取 Jar 的内容后生成的文件夹,其中各个文件夹作用是:
创建测试的 SpringBoot 项目,并且在 pom.xml 中开启镜像分层。
4.0.0
springboot-dockerfile-layer
jar
springboot-dockerfile-layer
springboot build layer example
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("/hello")
public String hello() {
return “hello world!”;
}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
为了方便体现出 SpringBoot 2.3.x 支持的分层构建 Dockerfile 的优点,这里在 Java 源码文件夹下,创建普通与分层两种构建镜像的 Dockerfile 脚本,后续会使用这两种脚本构建 Docker 镜像进行构建速度、推送速度、拉取速度的对比。
FROM openjdk:8u275
VOLUME /tmp
ADD target/*.jar app.jar
RUN sh -c ‘touch /app.jar’
ENV TZ=“Asia/Shanghai”
RUN ln -snf /usr/share/zoneinfo/KaTeX parse error: Expected 'EOF', got '&' at position 19: …/etc/localtime &̲& echo TZ > /etc/timezone
ENV JVM_OPTS="-XX:MaxRAMPercentage=80.0"
ENV JAVA_OPTS=""
ENTRYPOINT [ “sh”, “-c”, “java J A V A O P T S − D j a v a . s e c u r i t y . e g d = f i l e : /