简介

Docker多阶段构建允许你在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基础镜像,每个都开始一个新的构建阶段。

前提条件

  • 安装Docker (版本 17.05+)
  • 了解Dockerfile基础
  • 示例应用 (使用Go应用)
  • 步骤1: 单阶段构建的问题

    Go应用的典型单阶段Dockerfile:

    FROM golang:1.21
    

    WORKDIR /app

    COPY . .

    RUN go build -o myapp .

    CMD ["./myapp"]

    这会产生约800MB的镜像,因为包含了整个Go工具链。

    步骤2: 多阶段构建方案

    # 构建阶段
    

    FROM golang:1.21 AS builder

    WORKDIR /app

    COPY go.mod go.sum ./

    RUN go mod download

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .

    # 生产阶段

    FROM alpine:3.19

    RUN apk --no-cache add ca-certificates

    WORKDIR /root/

    COPY --from=builder /app/myapp .

    CMD ["./myapp"]

    结果:镜像从约800MB缩减到约15MB!

    步骤3: 构建和测试

    docker build -t myapp:multi-stage .
    

    docker images myapp

    docker run -p 8080:8080 myapp:multi-stage

    最佳实践

  • 始终使用特定的基础镜像标签
  • 优化指令顺序以利用缓存
  • 使用.dockerignore排除不必要的文件
  • 使用scratchdistroless构建最小镜像

总结

多阶段构建是创建生产就绪Docker镜像的必备技术。