Docker 多阶段构建允许我们在一个 Dockerfile 中使用多个 FROM
指令,每个 FROM
指令都代表一个构建阶段。这样我们就可以在不同阶段使用不同的基础镜像,并将最终结果"挑选"出来,从而实现镜像优化。
以 Go 程序为例,我们可以使用一个大体如下的 Dockerfile:
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
在第一个阶段,我们使用 golang:1.16
镜像来编译 Go 程序。在第二个阶段,我们使用体积较小的 alpine:latest
镜像作为最终的运行环境,并将第一阶段编译好的可执行文件复制过来。
这样做的好处是,最终镜像的体积只包含程序的运行时环境,不包含构建时环境,从而大大减小镜像的大小。
Docker 多阶段构建为优化镜像提供一个强大的工具。通过在不同阶段使用不同的基础镜像,我们可以有效地减小镜像的体积,保留程序的所有功能。这不仅可以加快镜像的构建和部署,也有助于提高应用程序的安全性。