从 1.2GB 到 182MB:一次 Python 项目 Docker 镜像瘦身实录

举报
yd_273693568 发表于 2026/10/22 00:57:01 2026/10/22
【摘要】 第一版 Dockerfile 只有五行,镜像 1.2GB、CI 推送四分多钟。用多阶段构建 + slim 基础镜像 + 合理的层顺序重写后,镜像 182MB、推送 40 秒,代码改动后的重建从 90 秒降到 3 秒。文章记录了每一步为什么有效。

上周把一个内部 Python 小工具容器化,第一版 Dockerfile 只有五行,docker images 一看 1.2GB,CI 每次推送四分多钟。重写后镜像 182MB、推送 40 秒。把真正起作用的几步记下来。

一、第一版为什么这么大

FROM python:3.11
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt

python:3.11 自带完整工具链(gcc、make、头文件),可运行时只需解释器和几个 wheel。更麻烦的是 COPY . . 放在 pip install 前面,改一行代码这层缓存就失效,依赖从头装——这才是 CI 慢的真因。

二、多阶段构建

FROM python:3.11 AS builder
WORKDIR /build
RUN apt-get install -y gcc libpq-dev
COPY requirements.txt .
RUN pip wheel --no-cache-dir -r requirements.txt -w /wheels

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /wheels /wheels
RUN pip install --no-cache-dir --no-index --find-links=/wheels /wheels/*
COPY main.py .
USER 1000:1000

三个要点:基础镜像换 -slim,1GB 降到 130MB;builder 里先编译成 wheel,运行时离线装,完全不需要 gcc;再加 USER 1000:1000,容器默认以 root 跑,被突破就等于拿到宿主机 root。

三、层缓存与 .dockerignore

Docker 的规则是「某层变了,后面全部失效」,所以变化慢的 requirements.txt 要放在 COPY . . 之前,这一步让本地重建从 90 秒降到 3 秒。再加个 .dockerignore 排除 .git、__pycache__、.venv,不改一行代码又省几百 MB。

四、结果

镜像 1.21GB → 182MB,推送 4 分 10 秒 → 40 秒,重建 90 秒 → 3 秒。

容器化不是「写个 Dockerfile 能跑就行」。多阶段构建、slim 镜像、合理的层顺序、.dockerignore,四件事不到半小时,却能把体积和迭代速度同时改进一个数量级。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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