简介
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排除不必要的文件scratch或distroless构建最小镜像总结
多阶段构建是创建生产就绪Docker镜像的必备技术。