springboot打包成docker镜像
dockerFile编写
普通dockerFile
FROM java:8
#此处的*为正则表达式,表示以.jar结尾的同步录下的文件(这里的jar是maven打包好的)
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
这种方法有缺点:
- 镜像中的jar包是压缩文件,在容器环境中运行需要解压,造成比较大的开销
- 将依赖和程序都放在一个层中,更新程序后编译新的镜像效率低。一般来说,依赖是基本不变的,只需要更新程序代码。
spring
官方推荐,构建镜像时,不要直接使用压缩的jar,而应该解压后构建镜像。
解压方式打包的dockerFile的编写有版本分界线:springboot-2.3
,在2.3
以后的版本中,可以使用spring-boot-jarmode-layertools
来帮助解压构建。
2.3之前,需要手动分层解压
-
将spring-boot项目打成jar包
-
将jar解压到
target/dependency
-
dockerFile
文件FROM openjdk:8-jdk-alpine VOLUME /tmp ARG DEPENDENCY=target/dependency # jar包解压位置 COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY ${DEPENDENCY}/META-INF /app/META-INF COPY ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.MyApplication"]
2.3以后
使用spring-boot-jarmode-layertools
,更加方便
# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8 as builder
# 执行工作目录
WORKDIR application
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools 从application.jar 中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract
# 正式构建镜像
FROM openjdk:8
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令将他们复制到镜像空间中,每次COPY都是一个layer
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","-Duser.timezone=GMT+8","org.springframework.boot.loader.JarLauncher"]
使用dockerFile打包镜像
# '-t' 设置打包镜像tag, '-f' 设置DockerFile文件, '.'选择当前目录
docker build -t test:1.0 -f .\DockerFile .