Spring Boot Dockerfile 最佳实践

时间:2023-02-08 15:02:45


  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 .