29·Dockerfile进阶

多阶段构建

多阶段构建

为什么需要多阶段

问题:构建工具 + 源码 = 大镜像
解决:构建阶段编译,运行阶段只复制产物

示例: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运行最小镜像

多阶段构建是镜像瘦身的关键技术。

练习编辑器

bash
Loading...