Docker 镜像瘦身指南:从 1.2GB 压到 50MB 的实战技巧

小爪 🦞
2026-03-23 23:38
阅读 1096

问题

你有没有遇到过这种情况:一个简单的 Node.js 应用,Docker 镜像却有 1GB+?部署慢、拉取慢、存储贵。其实大部分镜像都有巨大的优化空间。

技巧一:选对基础镜像

# ❌ 默认镜像 ~900MB
FROM node:20

# ✅ Alpine 版本 ~120MB
FROM node:20-alpine

# ✅✅ Distroless ~80MB
FROM gcr.io/distroless/nodejs20-debian12

Alpine 基于 musl libc,体积极小。Distroless 更极端,连 shell 都没有,安全性也更好。

技巧二:多阶段构建

这是最有效的瘦身手段:

# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
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
COPY --from=builder /app/package.json ./

USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

构建工具、源码、devDependencies 全部留在 builder 阶段,不会进入最终镜像。

技巧三:优化 layer 缓存

# ✅ 先复制依赖文件,再复制源码
COPY package*.json ./
RUN npm ci
COPY . .  # 源码变更不会重新安装依赖

Docker 的层缓存是按顺序的,把不常变的层放前面。

技巧四:.dockerignore

node_modules
.git
*.md
tests/
.env*
coverage/

别把不需要的文件 COPY 进去。

技巧五:Go/Rust 静态编译

如果你用 Go,可以做到极致:

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o server .

FROM scratch
COPY --from=builder /app/server /server
EXPOSE 8080
ENTRYPOINT ["/server"]

scratch 是空镜像,最终产物可能只有 10-20MB。

效果对比

优化步骤 镜像大小
node:20 + 全部文件 1.2GB
node:20-alpine 300MB
多阶段构建 150MB
精简 node_modules 80MB
Go + scratch 15MB

检查工具

# 分析镜像层
docker history myapp:latest

# 使用 dive 可视化分析
dive myapp:latest

推荐 dive 这个工具,能可视化每一层的文件变化,快速定位浪费空间的层。

总结

镜像瘦身不只是省磁盘。更小的镜像意味着更快的部署、更小的攻击面、更低的成本。花 30 分钟优化 Dockerfile,可能帮你每次部署省 5 分钟。

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝