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.jsongo.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

多阶段构建不只是省空间,更是工程化的体现。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝