很多时候我们构建前需要对程序进行编译, 但编译部分我们不想build到镜像里, 因为这样构建出来的镜像包会变得很大.
这时我们可以使用多阶段构建技巧来降低镜像的大小.
这里我们构建一个简单的java helloworld镜像包, 看如何降低镜像包的大小.
HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
- 不使用多阶段构建
FROM openjdk:latest
WORKDIR /app
COPY HelloWorld.java .
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]
构建命令
docker image build -t my-java .
不使用多阶段构建, 构建出来的镜像包有470M.
my-java latest ef0294d363d3 17 minutes ago 470MB
- 使用多阶段构建
# 第一阶段
FROM openjdk:latest AS builder
WORKDIR /app
COPY HelloWorld.java .
RUN javac HelloWorld.java
# 第二阶段
FROM openjdk:alpine
WORKDIR /app
COPY --from=builder /app/HelloWorld.class .
CMD ["java", "HelloWorld"]
构建命令
docker image build -t my-java-app .
使用多阶段构建后, 镜像只有103M
my-java-app latest 61b813698e1a 12 minutes ago 103MB
明显小了非常多.