镜像瘦身需从dockerfile编写阶段入手:合并run指令减少层数,包管理器加--no-cache并清理缓存,采用多阶段构建剥离编译环境,优先选用alpine/slim/distroless等轻量基础镜像。

镜像瘦身不是靠后期压缩,而是从 Dockerfile 编写阶段就控制层数、清除缓存、精简内容。核心思路很直接:少一层是一层,不带多余文件进最终镜像。
合并 RUN 指令,减少镜像层数
Dockerfile 中每条 RUN、COPY、FROM 都会生成一个新层。层越多,镜像体积越大,构建缓存也越难复用。关键不是“能不能拆”,而是“有没有必要拆”。
- 把多个安装命令合并在一条 RUN 中,比如 RUN apt update && apt install -y curl nginx && rm -rf /var/lib/apt/lists/*
- 避免写成三行独立的 RUN,那样会产生三个层,中间两层还残留了未清理的包索引
- 对 Alpine 用户,同样适用:RUN apk add --no-cache curl nginx && rm -rf /var/cache/apk/*
所有包管理器加 --no-cache 参数
apt、apk、pip、npm 默认都会缓存下载的包和索引,这些内容在运行时完全不需要,却常占几十 MB。
-
apt:用 --no-install-recommends + 清理
/var/lib/apt/lists/ -
apk:始终加 --no-cache,再删
/var/cache/apk/ -
pip:用 --no-cache-dir,并避免全局安装(改用
--user或虚拟环境) -
npm:加 --no-cache,构建后删
node_modules/.cache
用多阶段构建剥离编译环境
这是最彻底的瘦身方式——让编译工具链根本不出现在最终镜像里。
- 第一阶段用完整镜像(如
golang:1.23或node:20)做构建和依赖安装 - 第二阶段换轻量镜像(如
alpine:3.18或distroless),只COPY --from=builder最终产物 - Go 二进制可静态链接,连 alpine 都不用,直接上
scratch
选对基础镜像,开局就省一半
基础镜像决定下限。ubuntu:latest(77MB)、centos(200MB+)这类全功能发行版,只跑一个 Python 脚本太浪费。
- 优先选 -alpine 标签:5MB 左右,musl libc 兼容大多数应用
- 次选 -slim(如
python:3.11-slim):基于 Debian,比 full 版小 60%+,glibc 兼容性更好 - 安全要求极高时,用 distroless 镜像:无 shell、无包管理器,只含运行时依赖











