0%

springboot分层打包docker镜像

说明

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 inspectdocker historydive 等工具对比全量打包和分层打包的区别.