Docker 镜像瘦身实战:从 1GB 到 100MB 的五个动作

举报
yd_278701352 发表于 2026/10/26 06:11:22 2026/10/26
【摘要】 一个 Node 服务的镜像曾有 1GB 多,推送和拉取都很慢,节点磁盘也被旧镜像占满。按下面五个动作处理后,同一份代码稳定在 100MB 左右,部署明显变快。 1. 多阶段构建不要把编译工具和测试依赖留在最终镜像里。第一阶段编译打包,第二阶段只复制运行产物。FROM node:20 AS buildWORKDIR /appCOPY package*.json ./RUN npm ci && ...

一个 Node 服务的镜像曾有 1GB 多,推送和拉取都很慢,节点磁盘也被旧镜像占满。按下面五个动作处理后,同一份代码稳定在 100MB 左右,部署明显变快。

1. 多阶段构建

不要把编译工具和测试依赖留在最终镜像里。第一阶段编译打包,第二阶段只复制运行产物。

FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci && COPY . . && npm run build
FROM node:20-alpine
COPY --from=build /app/dist ./dist
RUN npm ci --omit=dev

最终镜像只放运行时需要的东西,体积和攻击面都会变小。

2. 选小基础镜像

完整版 Node 镜像和 alpine 版可能差几百 MB。应用不需要完整系统工具链时,优先用 alpine、slim 或 distroless。要注意 alpine 用 musl,个别原生模块要重新编译,上线前先跑通接口和健康检查。

3. 合并 RUN 层

每条 RUN 产生一层,上一层下载的东西,下一层删除也无法让上一层变小。下载、安装和清理要写在同一条 RUN 里。

RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*

先复制 package.json 装依赖,再复制源码,这样依赖层能被缓存。

4. 写好 .dockerignore

构建上下文会把本地目录发给 Docker,node_modules、日志、.git 和测试数据都不应打进去,否则构建变慢,还可能带入无用文件。

node_modules
.git
*.log
.env

构建前看一下上下文大小,几百 MB 时先检查是不是漏了目录。

5. 清理缓存

npm、pip、apt 的缓存是隐形大户,生产镜像不需要它们。安装时用 --no-cache 或 --omit=dev,结束后清理缓存。

RUN npm ci --omit=dev && npm cache clean --force

最后用 docker history 看每层大小,确认哪层仍偏大。按这五步走一遍,大多数 1GB 级镜像都有机会降到 100MB 量级。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。