- 最简单的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"]
- 使用用户权限降低风险
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"]
- 提高构建和启动时的性能
在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 .