先量再减:看清脂肪在哪
动手前先用 `docker images` 看体积,再用 `dive` 逐层分析每层新增了什么。没有度量就没有方向。
docker images
# 或逐层分析:
dive <image>步骤一:换小基础镜像
把 `ubuntu`/`debian` 换成 `alpine`、`slim` 或 `distroless`。仅这一项常能砍掉几百 MB。注意 alpine 用 musl libc,个别二进制需重编译。
FROM node:20-alpine # 而非 node:20(基于 debian)步骤二:多阶段构建
编译依赖放在构建阶段,最终镜像只 COPY 编译产物。运行阶段不需要 gcc、node_modules 源码等。
FROM golang:1.22 AS build
RUN go build -o app .
FROM gcr.io/distroless/static
COPY --from=build /app /app
ENTRYPOINT ["/app"]步骤三:.dockerignore 别漏
没有 `.dockerignore` 时,`COPY . /app` 会把 node_modules、.git、本地日志全打进镜像。加一份忽略清单立省空间。
node_modules
.git
*.log
.env步骤四:合并 RUN 并清理缓存
每条 RUN 是一层。把安装与清理放在同一条 RUN 里,避免「装了又删」却留在上一层。
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl \
&& rm -rf /var/lib/apt/lists/*步骤五:复核与固化
重建后用 `docker images` 对比前后体积,并把最佳实践固化进项目模板,避免下次又膨胀。