说明
springboot默认的打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
及对应的Dockerfile文件
FROM openjdk:8-jdk-alpine
MAINTAINER happywzy
WORKDIR application
EXPOSE 8080
ADD ./target/*.jar ./app.jar
CMD java -jar app.jar
打包命令
mvn clean package
docker build -t test:1.0.0 .
这种方式打包 springboot
缺点是每次打包 docker 镜像都是全量上传 ja r包,如果 jar 很大会严重影响拉取镜像的速度.
springboot 分层打包
springboot 分层打包需要 springboot 版本大于 2.3.0.RELEASE
.
开启
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</build>
再次使用 mvn clean package
命令打包,可以使用 java 包分析工具查看
java -Djarmode=layertools -jar target/test-0.0.1-SNAPSHOT.jar list
改造原有的 Dockerfile
FROM openjdk:8-jdk-alpine as builder
WORKDIR application
ADD ./target/*.jar ./app.jar
RUN java -Djarmode=layertools -jar app.jar extract
FROM openjdk:8-jdk-alpine
MAINTAINER happywzy
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/ ./
EXPOSE 8080
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
这个 dockerfile 表示先进行一次临时镜像构建标记为 builder,并加载一次全量 jar 包,然后执行 java -Djarmode=layertools -jar app.jar extract
命令将 jar 包分解为分层打包目录,再次构建一个新镜像,按照list 的目录顺序分批将分层目录加载到 docker 镜像中. 再次执行构建命令
docker build -t test:1.0.0 .
docker镜像分析
可以使用 docker inspect
、docker history
或 dive
等工具对比全量打包和分层打包的区别.