多阶段构建
为什么需要多阶段
问题:构建工具 + 源码 = 大镜像
解决:构建阶段编译,运行阶段只复制产物
示例:Go 应用
# 阶段 1:构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o server .
# 阶段 2:运行
FROM alpine:3.18
COPY --from=builder /app/server /server
CMD ["/server"]
最终镜像只包含:
- alpine 基础(5MB)
- 编译好的二进制(10MB)
总大小:~15MB(而不是 1GB+)
示例:Node.js 应用
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 运行阶段
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]
小结
| 阶段 | 作用 | 产物 |
|---|---|---|
| builder | 编译构建 | 二进制/产物 |
| final | 运行 | 最小镜像 |
多阶段构建是镜像瘦身的关键技术。