Dockerfile多阶段构建

53 阅读1分钟

很多时候我们构建前需要对程序进行编译, 但编译部分我们不想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 

明显小了非常多.