基于 JDK 8 制作 JAR 包镜像(使用Dockerfile)

基于 JDK 8 制作 JAR 包镜像的 Dockerfile 可以分为两种方式:
  1. 直接使用 JAR 文件(适用于已有 JAR 文件)。
  2. 多阶段构建(适用于从源码构建 JAR 文件)。

以下是两种方式的 Dockerfile 示例及详细说明:

方式 1:直接使用 JAR 文件
Dockerfile 示例
# 使用官方的 OpenJDK 8 镜像作为基础镜像
FROM openjdk:8-jre-alpine

# 设置工作目录
WORKDIR /app

# 将本地的 JAR 文件复制到镜像中的 /app 目录
COPY target/my-app.jar /app/my-app.jar

# 暴露应用程序运行的端口
EXPOSE 8080

# 设置启动命令
ENTRYPOINT ["java", "-jar", "my-app.jar"]
详细说明
  1. FROM
    • 使用 openjdk:8-jre-alpine 作为基础镜像,这是一个基于 Alpine Linux 的轻量级 OpenJDK 8 运行时环境。
    • 如果应用需要 JDK(而不是 JRE),可以使用 openjdk:8-jdk-alpine
  1. WORKDIR
    • 设置工作目录为 /app,后续命令都会在该目录下执行。
  1. COPY
    • 将本地的 target/my-app.jar 文件复制到镜像中的 /app 目录。
  1. EXPOSE
    • 声明容器运行时监听的端口(例如 8080)。
  1. ENTRYPOINT
    • 使用 java -jar 命令运行 JAR 文件。
构建和运行
  1. 构建镜像:
docker build -t my-java-app .
  1. 运行容器:
docker run -p 8080:8080 my-java-app
方式 2:多阶段构建(从源码构建 JAR 文件)
Dockerfile 示例
# 第一阶段:使用 JDK 8 构建 JAR 文件
FROM maven:3.8.4-openjdk-8 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package

# 第二阶段:使用 JRE 8 运行 JAR 文件
FROM openjdk:8-jre-alpine
WORKDIR /app
COPY --from=build /app/target/my-app.jar /app/my-app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "my-app.jar"]
详细说明
  1. 第一阶段:构建 JAR 文件
    • 使用 maven:3.8.4-openjdk-8 作为基础镜像,这是一个包含 Maven 和 JDK 8 的镜像。
    • 复制 pom.xmlsrc 目录到镜像中。
    • 运行 mvn clean package 命令构建 JAR 文件。
  1. 第二阶段:运行 JAR 文件
    • 使用 openjdk:8-jre-alpine 作为基础镜像,这是一个轻量级的 OpenJDK 8 运行时环境。
    • 从第一阶段复制生成的 JAR 文件到 /app 目录。
    • 暴露端口并设置启动命令。
构建和运行
  1. 构建镜像:
docker build -t my-java-app .
  1. 运行容器:
docker run -p 8080:8080 my-java-app
优化建议
  1. 使用 .dockerignore 文件
    • 在构建镜像时,忽略不必要的文件(如 target/.git/ 等),以加快构建速度。
    • 示例 .dockerignore 文件:
target/
.git/
*.iml
  1. 减小镜像体积
    • 使用 alpine 版本的镜像。
    • 在多阶段构建中,只将必要的文件(如 JAR 文件)复制到最终镜像。
  1. 传递环境变量
    • 如果应用程序需要配置参数,可以通过环境变量传递:
ENV APP_OPTS=""
ENTRYPOINT ["java", "-jar", "my-app.jar", "$APP_OPTS"]
    • 运行容器时:
docker run -e APP_OPTS="--spring.profiles.active=prod" -p 8080:8080 my-java-app
总结
  • 如果已有 JAR 文件,直接使用 COPY 命令将其复制到镜像中即可。
  • 如果需要从源码构建 JAR 文件,推荐使用多阶段构建,以减小最终镜像体积。
  • 基于 JDK 8 的镜像可以使用 openjdk:8-jre-alpineopenjdk:8-jdk-alpine,具体取决于是否需要编译代码。