← 返回技术随笔仓库

Docker 镜像瘦身:从 1.2G 到 90M

发布时间:2026-11-11容器云原生

基础镜像是第一刀:openjdk 完整镜像几百 M 起步,换 eclipse-temurin:17-jre-alpine(约 180M)或 distroless/java17(约 230M,无 shell 更安全)。alpine 的 musl libc 对绝大多数 Java 应用无感,但依赖 glibc 的本地库要测试。Node 应用同理,node:20-alpine 比 node:20 小一个量级。极端场景用 scratch 或 distroless,代价是排障时没有 shell 可以 exec 进去,要配 debug 镜像预案。

多阶段构建是第二刀:编译环境(maven/gradle/node_modules)留在 builder 阶段,最终镜像只 COPY 产物。Java 项目最终层就一个 jar + jre 基础镜像,通常 200-300M 搞定。前端项目 build 完只剩 dist 静态文件,配 nginx:alpine 总大小 50M 以内。

第三刀是层管理:RUN 命令用 && 串联并清理缓存(apt-get update && apt-get install -y --no-install-recommends xxx && rm -rf /var/lib/apt/lists/*),每个 RUN 是一层,装完不清缓存就把垃圾永久留在层里。.dockerignore 排除 .git、node_modules、构建产物,防止 COPY . 把 500M 的 .git 塞进上下文——构建上下文传输本身就会慢到怀疑人生。收益不止磁盘和拉取速度:镜像层少了,构建缓存命中率高,CI 从 8 分钟降到 2 分钟是常态。