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”]
