之前一直使用Dockerfile
的方式将Spring Boot应用
构建成Docker Image
, 发现jar包只有十几兆,但是构建出现的镜像有几百兆,传输的时候非常慢。后来发现spring-boot-maven-plugin
插件可以分层构建Docker Image
,尝试了一下,效果挺不错。
将Spring Boot
应用打包成Docker Image
最常用的方式使用编写Dockerfile
,使用docker build
命令手动打包。
Dockerfile
内容如下:
FROM openjdk:17 WORKDIR /app COPY target/*.jar /app/app.jar ENTRYPOINT ["java","-jar","/app/app.jar"] 复制代码
使用docker images
查看镜像,可以发现多了两个镜像:webflux_demo_file
和openjdk
。webflux_demo_file
是应用程序最终构建的镜像,openjdk
是被依赖的基础镜像。从镜像大小我们可以看到webflux_demo_file
镜像共796m,而基础镜像openjdk
就占了471m。
spring boot 2.3
之后的spring-boot-maven-plugin
插件支持将应用程序构建成Docker Image
,并且支持分层构建、将镜像推送到镜像仓库等功能。
要使用spring-boot-maven-plugin
插件分层构建应用程序,需要在pom
文件中加入一些配置。
pom
文件在spring-boot-maven-plugin
增加配置开启分层构建并配置分层的方式。
<properties> <!--声明时间戳的格式化方式--> <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format> </properties> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <!--开启分层构建--> <enabled>true</enabled> <!--构建配置--> <configuration>${project.basedir}/layers.xml</configuration> </layers> <image> <!--镜像名称, 使用构建时间作为镜像的版本号--> <name>example.com/webflux_demo:${maven.build.timestamp}</name> </image> </configuration> </plugin> 复制代码
layers.xml
文件layers.xml
文件配置了分层构建的方式,内容如下:
<layers xmlns="http://www.springframework.org/schema/boot/layers" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/boot/layers https://www.springframework.org/schema/boot/layers/layers-2.6.xsd"> <application> <into layer="spring-boot-loader"> <include>org/springframework/boot/loader/**</include> </into> <into layer="application" /> </application> <dependencies> <into layer="application"> <includeModuleDependencies /> </into> <into layer="snapshot-dependencies"> <include>*:*:*SNAPSHOT</include> </into> <into layer="dependencies" /> </dependencies> <layerOrder> <layer>dependencies</layer> <layer>spring-boot-loader</layer> <layer>snapshot-dependencies</layer> <layer>application</layer> </layerOrder> </layers> 复制代码
使用mvn spring-boot:build-image
命令或者在maven工具
中双击spring-boot:build-image
开始构建镜像。如图
构建信息过多,这里截取部分。如下图
使用docker images
查看镜像,可以看到使用这种方式构建的镜像只有282m。比使用之前的镜像小了一半。
美中不足的是构建的时候需要从github下载一个包,导致构建时间很长