互联网技术 / 互联网资讯 · 2024年3月18日

使用 Dockerfile 构建 Java 镜像的核心技术指南

Dockerfile 是一个文本文件,包含组装 Docker 镜像所需的指令。当你执行 docker build 命令时,Docker 会读取这些指令,按顺序执行,并据此创建镜像。

下面展示如何为你的应用程序编写 Dockerfile,并在项目根目录创建该文件以便构建镜像。

第一行可选但推荐添加的是 # syntax 指令。这个指令告知构建工具(如 BuildKit)在解析 Dockerfile 时使用的语法版本,并在需要时自动升级解析器。解析器指令应位于 Dockerfile 的第一行,是所有注释、空格或其他指令之前的内容。

通常建议使用 docker/dockerfile:1,它总是指向语法版本 1 的最新版本。BuildKit 在构建之前会自动检查并更新语法版本,确保你使用的是最新版。

接下来,在 Dockerfile 中指定应用的基础镜像。镜像可以从其他镜像继承,在本示例中我们使用官方 OpenJDK 镜像以及 Java 开发工具包,确保运行 Java 应用所需的一切都已就绪。

FROM openjdk:16-alpine3.13

为了简化后续步骤,设置工作目录。这样之后的所有命令都将在这个目录下执行,并且可以使用相对路径,避免重复输入完整路径。

WORKDIR /app

通常在开始构建应用之前,需要先获取并安装依赖项。为了在镜像构建阶段就缓存依赖,我们将相关文件复制到镜像中,再执行依赖下载。

使用 COPY 将本地文件复制到镜像中。下面的命令把项目需要的 Maven Wrapper 和 pom.xml 文件复制到工作目录 /app。

COPY .mvn/ .mvn

COPY mvnw pom.xml ./

接下来,使用 RUN 命令执行 Maven Wrapper 的依赖项下载,目标是在镜像中缓存依赖项。执行的语句与在本地机器上执行 mvnw dependency:go-offline 一致,但结果是在镜像内完成。

RUN ./mvnw dependency:go-offline

现在我们已经拥有一个基于 OpenJDK 16 的 Alpine 3.13 镜像,并且已将依赖项缓存到镜像中。接着将源代码添加到镜像中,方式与前面的文件复制类似。

COPY src ./src

最后,定义容器启动时执行的命令。通过 CMD 指定默认执行的程序及参数。

CMD [“./mvnw”, “spring-boot:run”]

以下是完整的 Dockerfile 示例,供对照参考。

FROM openjdk:16-alpine3.13

WORKDIR /app

COPY .mvn/ .mvn

COPY mvnw pom.xml ./

RUN ./mvnw dependency:go-offline

COPY src ./src

CMD [“./mvnw”, “spring-boot:run”]