基于 JDK 8 制作 JAR 包镜像的 Dockerfile 可以分为两种方式:
- 直接使用 JAR 文件(适用于已有 JAR 文件)。
- 多阶段构建(适用于从源码构建 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"]
详细说明
- FROM
-
- 使用
openjdk:8-jre-alpine
作为基础镜像,这是一个基于 Alpine Linux 的轻量级 OpenJDK 8 运行时环境。 - 如果应用需要 JDK(而不是 JRE),可以使用
openjdk:8-jdk-alpine
。
- 使用
- WORKDIR
-
- 设置工作目录为
/app
,后续命令都会在该目录下执行。
- 设置工作目录为
- COPY
-
- 将本地的
target/my-app.jar
文件复制到镜像中的/app
目录。
- 将本地的
- EXPOSE
-
- 声明容器运行时监听的端口(例如
8080
)。
- 声明容器运行时监听的端口(例如
- ENTRYPOINT
-
- 使用
java -jar
命令运行 JAR 文件。
- 使用
构建和运行
- 构建镜像:
docker build -t my-java-app .
- 运行容器:
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"]
详细说明
- 第一阶段:构建 JAR 文件
-
- 使用
maven:3.8.4-openjdk-8
作为基础镜像,这是一个包含 Maven 和 JDK 8 的镜像。 - 复制
pom.xml
和src
目录到镜像中。 - 运行
mvn clean package
命令构建 JAR 文件。
- 使用
- 第二阶段:运行 JAR 文件
-
- 使用
openjdk:8-jre-alpine
作为基础镜像,这是一个轻量级的 OpenJDK 8 运行时环境。 - 从第一阶段复制生成的 JAR 文件到
/app
目录。 - 暴露端口并设置启动命令。
- 使用
构建和运行
- 构建镜像:
docker build -t my-java-app .
- 运行容器:
docker run -p 8080:8080 my-java-app
优化建议
- 使用
.dockerignore
文件
-
- 在构建镜像时,忽略不必要的文件(如
target/
、.git/
等),以加快构建速度。 - 示例
.dockerignore
文件:
- 在构建镜像时,忽略不必要的文件(如
target/
.git/
*.iml
- 减小镜像体积
-
- 使用
alpine
版本的镜像。 - 在多阶段构建中,只将必要的文件(如 JAR 文件)复制到最终镜像。
- 使用
- 传递环境变量
-
- 如果应用程序需要配置参数,可以通过环境变量传递:
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-alpine
或openjdk:8-jdk-alpine
,具体取决于是否需要编译代码。