镜像瘦身
约 668 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Docker › Dockerfile 构建(在新窗口打开) › 镜像瘦身
镜像越小,拉取越快、启动越快、安全风险面越小。下面是一套系统的镜像瘦身方法。
基础镜像选择
# ❌ 大镜像(~1.2GB)
FROM node:20
# ✅ 精简版(~230MB)
FROM node:20-slim
# ✅ 最小版(~130MB)
FROM node:20-alpine
# ❌ 大镜像
FROM python:3.12
# ✅ 精简版
FROM python:3.12-slim常见镜像体积对比:
| 基础镜像 | 体积 |
|---|---|
ubuntu:22.04 | ~77MB |
debian:bookworm-slim | ~80MB |
alpine:3.19 | ~7MB |
node:20 | ~1.1GB |
node:20-slim | ~230MB |
node:20-alpine | ~130MB |
python:3.12 | ~1GB |
python:3.12-slim | ~250MB |
清理包管理器缓存
# Alpine (apk)
RUN apk add --no-cache curl # --no-cache 自动清理缓存
# Ubuntu/Debian (apt)
RUN apt update && \
apt install -y curl && \
rm -rf /var/lib/apt/lists/* # 清理 apt 缓存
# CentOS/RHEL (yum)
RUN yum install -y curl && \
yum clean all && \
rm -rf /var/cache/yum/*减少 RUN 指令的层数
# ❌ 每个 RUN 一层,产生 4 层
RUN apt update
RUN apt install -y curl vim
RUN rm -rf /var/lib/apt/lists/*
RUN apt clean
# ✅ 合并为一个 RUN,只产生 1 层
RUN apt update && \
apt install -y curl vim && \
rm -rf /var/lib/apt/lists/* && \
apt clean只安装生产依赖
# Node
RUN npm ci --only=production # 不装 devDependencies
# Python
RUN pip install --no-cache-dir -r requirements.txt # 并且清理 pip 缓存
# PHP
RUN composer install --no-dev多阶段构建
详见上一节,这是最有效的瘦身手段:
FROM golang:1.22 AS builder
RUN go build -o server
FROM alpine:3.19
COPY --from=builder /go/server /server
# 镜像从 ~1GB 降到 ~15MB其他瘦身技巧
# 1. 不安装调试工具(生产镜像不需要 vim、curl)
# 2. 使用 --no-install-recommends(apt)
RUN apt update && \
apt install -y --no-install-recommends curl && \
rm -rf /var/lib/apt/lists/*
# 3. 合并多个 COPY 减少层数
COPY package.json package-lock.json ./
# 不推荐:COPY package.json . && COPY package-lock.json ./
# 4. RUN 命令合并 chmod 和删除
RUN chmod +x /start.sh && rm -rf /tmp/*查看镜像层大小
# 查看每层的大小
docker history myapp
# IMAGE CREATED CREATED BY SIZE
# 0e901e68141f 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
# <missing> 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
# <missing> 2 weeks ago /bin/sh -c set -x && addgroup -g 101 -S … 7.8MB
# <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:abc123... in / 5.4MB# 使用 dive 工具分析镜像
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest myapp瘦身效果对比
# 优化前
docker images myapp-before
# 1.2GB
# 优化后(多阶段 + Alpine + 清理缓存)
docker images myapp-after
# 150MB(缩小约 8 倍)小结
- 选择最小的基础镜像(Alpine / Slim)是最大的单步优化。
--no-cache(apk)、rm -rf /var/lib/apt/lists/*清理包管理缓存。npm ci --only=production只安装生产依赖。- 多阶段构建将构建工具与运行产物分离,可节省 80%~90% 的空间。
- 使用
docker history或dive分析镜像层大小,定位优化点。
上一节:多阶段构建 下一节:Volume 与 Bind Mount
