Spring Boot Dockerfile 最佳实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot Dockerfile 最佳实践相关的知识,希望对你有一定的参考价值。


  1. 最简单的Dockfile

这个 Dockerfile 非常简单,但它是运行 Spring Boot 应用程序所需要的一切,没有任何多余的装饰:只有 Java 和一个 JAR 文件。

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY $JAR_FILE app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 使用用户权限降低风险
FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG JAR_FILE=target/*.jar
COPY $JAR_FILE app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 提高构建和启动时的性能

在Spring Boot JAR文件中,依赖项和应用程序资源之间存在清晰的分离,我们可以利用这一事实来提高性能。关键是在容器文件系统中创建层。这些层在构建时和运行时(在大多数运行时)都缓存,因此我们希望将最频繁更改的资源(通常是应用程序本身中的类和静态资源)分层在变化较慢的资源之后。

这个Dockerfile依赖于解压后的JAR包文件,所以需要一下命令配合:

mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)

解压后的目录:​​BOOT-INF​​ ​​META-INF​​ ​​org​

FROM openjdk:8-jdk-alpine  

# 由于验证码使用了本地的字体库 需要添加ttf-dejavu字体库
RUN apk --update add ttf-dejavu; \\
rm -rf /var/cache/apk/*

## 如果放开需要解决 写日志权限问题
#RUN addgroup -S spring && adduser -S spring -G spring
#USER spring:spring

ARG DEPENDENCY=target/dependency

COPY $DEPENDENCY/BOOT-INF/lib /app/lib
COPY $DEPENDENCY/META-INF /app/META-INF
COPY $DEPENDENCY/BOOT-INF/classes /app

EXPOSE 8080

# 直接使用启动类启动会比使用Jar包启动寻址更快
ENTRYPOINT ["java","-Duser.timezone=GMT+08","-cp","app:app/lib/*","cn.demo.Application"]

最后附上解压和构建镜像的命令脚本:

#mvn clean && mvn  -DskipTests=true package  
FILE=target/dependency
if [ -d "$FILE" ]; then
rm -f $FILE
fi

# 解压jar包的文件
mkdir -p $FILE && (cd target/dependency; jar -xf ../demo-1.0.0.jar)

# 构建镜像
docker build -t demo:1.0.0 .

以上是关于Spring Boot Dockerfile 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile 和 Docker Compose 与 Java Spring Boot、Gradle 和 PostgreSQL [重复]

docker 构建 spring boot项目

怎么把spring boot打包成镜像部署到docker

构建Spring Boot应用镜像

K8s 部署 Spring boot 实践应用指南

使用 Spring Boot 和 Docker 的外部属性文件