← 中文资源

简体中文版本

用多阶段构建压缩 Docker 镜像

将 Dockerfile 拆为构建阶段与运行阶段,仅拷贝编译产物,度量体积削减后再推送更小镜像。

阅读英文原文

两个阶段,一个镜像

多阶段构建用重镜像编译、用瘦镜像运行。只有 COPY –from=build 指定的产物进入最终镜像,工具链、开发依赖和源码都不会进入仓库。

FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-slim AS runtime
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

度量收益

构建两种变体并对比。体积通常下降一个数量级,拉取更快、部署更快、仓库不再膨胀。

docker build -t app:multistage .
docker images app --format "{{.Size}}"

预期结果

多阶段镜像低于 150 MB,部署拉取以秒计,运行阶段不含源码或开发依赖。若原生模块缺失,应在运行阶段安装而非拷贝整个构建树。slim 基础若缺 ca-certificates 会影响 TLS,需显式补上。