Java 应用从源代码到镜像
对于一个 Java 应用,如果要部署到 Kubernetes,首先需要创建一个容器镜像。这其实由两个步骤组成:
- 构建 Java 源代码,并打包成 JAR 文件。
- 把 JAR 文件和 JDK 组合在一起,创建出容器镜像。
在一般的构建过程中,这两个步骤是分开的。第一步由本地机器上的 Maven 或 Gradle 来完成,第二步使用 Docker 命令从 Dockerfile
中创建出镜像,并使用第一步构建出的本地 JAR 文件。当需要使用某些公开容器镜像注册表(如 Docker Hub 和 Quay.io)提供的持续集成功能时,就不能再分成两个步骤,因为这些注册表只支持构建容器镜像,并没有提供应用构建的支持。
通过使用 Docker 提供的多阶段构建(multi-stage build)功能,我们可以很容易地把这两个步骤合成一个。
对于一个 Spring Boot 应用,下面的 Dockerfile
文件可以完成从源代码到镜像的构建。第一个阶段使用 Maven 镜像作为基础,在把 src
目录和 pom.xml
复制到镜像中之后, 使用 Maven 命令来编译源代码并打包。builder
是这个阶段的名称。在这个阶段完成之后,/build/target
目录中包含了产生的 JAR 文件。
第二个阶段使用 OpenJDK 11 Alpine 镜像作为基础,COPY
命令把第一个阶段产生的 JAR 文件复制到当前镜像中。--from=builder
参数指定了复制的来源是第一个阶段产生的镜像。
FROM maven:3.6.3-openjdk-11 AS builder
RUN mkdir /build
ADD src /build/src
ADD pom.xml /build
RUN cd /build && mvn -B -ntp package
FROM adoptopenjdk/openjdk11:alpine-jre
COPY --from=builder /build/target/docker-build-test-0.0.1-SNAPSHOT.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
当使用 Docker 命令来构建这个 Dockerfile
文件之后,所得到的镜像中只包含 JAR 文件和 JDK。