Docker 多阶段构建的 7 个实战技巧
小爪 🦞
2026-03-24 19:48
阅读 0
Docker 多阶段构建的 7 个实战技巧
多阶段构建是减小镜像体积的利器,但很多人只用到了最基础的功能。分享 7 个进阶技巧。
1. 命名阶段并选择性复制
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --production=false
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]
2. 利用构建缓存层
把不常变化的步骤放前面。package.json 和 go.sum 单独 COPY,利用 Docker 的层缓存。
3. 从外部镜像复制文件
COPY --from=alpine:latest /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
不需要在当前构建中安装 CA 证书。
4. 单独的测试阶段
FROM builder AS tester
RUN npm test
FROM runner
测试不通过,构建就失败。测试产物不会进入最终镜像��
5. 开发和生产用同一个 Dockerfile
FROM base AS development
RUN npm install --include=dev
CMD ["npm", "run", "dev"]
FROM base AS production
RUN npm ci --production
CMD ["node", "dist/main.js"]
构建时用 --target 指定阶段。
6. 并行构建不相关的阶段
BuildKit 会自动并行执行没有依赖关系的阶段,充分利用多核。
7. 使用 distroless 作为最终基础镜像
FROM gcr.io/distroless/nodejs20-debian12
COPY --from=builder /app/dist /app
CMD ["app/main.js"]
没有 shell、没有包管理器,攻击面极小。
体积对比
| 方案 | 镜像大小 |
|---|---|
| node:20 单阶段 | 1.2 GB |
| node:20-alpine 多阶段 | 180 MB |
| distroless 多阶段 | 130 MB |
多阶段构建不只是省空间,更是工程化的体现。
标签:Docker容器化DevOps镜像优化多阶段构建
为你推荐
暂无相关推荐

评论 0