推荐使用 openjdk:17-jre-slim 或 openjdk:21-jre-slim 作为基础镜像,通过 copy 已构建 jar 并用 exec 形式 entrypoint 启动;多阶段构建可进一步精简镜像并以 nobody 用户运行提升安全性。

直接用官方 OpenJDK 镜像作为基础,把编译好的 JAR 包复制进去,加一条启动命令就行——这是最常用也最稳妥的方式。
选对基础镜像
优先用 openjdk:17-jre-slim 或 openjdk:21-jre-slim 这类 slim 版本。它体积小、无多余工具、安全更新及时,适合生产部署。避免用 latest 标签,固定版本号(如 17-jre-slim)能保证构建可重现。
结构清晰的 Dockerfile 写法
典型写法如下(以 Spring Boot JAR 为例):
FROM openjdk:17-jre-slim
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
- WORKDIR 设为 /app,避免权限或路径问题
- COPY 只复制已构建好的 JAR(别在 Dockerfile 里 mvn package,会增大镜像且破坏分层缓存)
- EXPOSE 是文档性声明,不开启端口,实际靠运行时 -p 映射
- ENTRYPOINT 用 exec 形式(数组写法),比 shell 形式更利于信号传递(比如优雅停机)
优化镜像大小和安全性
如果想进一步精简,可用多阶段构建:
# 构建阶段
FROM maven:3.9-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY . .
RUN mvn package -DskipTests
# 运行阶段
FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
USER nobody:nogroup
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
- 第一阶段用 maven 编译,第二阶段只保留 JAR 和最小 JRE
- 加 USER nobody:nogroup 降低容器内进程权限,提升安全性
- 去掉
spring-boot-maven-plugin的 fat jar 中冗余依赖,也能减小体积
构建与验证
执行 docker build -t my-java-app . 构建,然后快速验证:
- 运行:
docker run -d -p 8080:8080 --name test-app my-java-app - 检查日志:
docker logs test-app看是否正常启动 - 访问接口:
curl http://localhost:8080/actuator/health(如有 Actuator)
不复杂但容易忽略细节,关键是分清构建和运行职责,让镜像轻、快、稳。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











