Docker 多阶段构建:把 Python 应用镜像从 1GB 瘦到 100MB
【摘要】 Docker 多阶段构建:把 Python 应用镜像从 1GB 瘦到 100MB 为什么镜像会越来越大很多同学的 Python 镜像动辄 1GB 以上:基础镜像带了完整编译工具链,pip 安装时又留下缓存和构建依赖。镜像大不仅推送慢、拉取慢,还扩大了攻击面。Docker 的多阶段构建(multi-stage build)正是为解决这个问题而生。 核心思路多阶段构建允许在一个 Dockerf...
Docker 多阶段构建:把 Python 应用镜像从 1GB 瘦到 100MB
为什么镜像会越来越大
很多同学的 Python 镜像动辄 1GB 以上:基础镜像带了完整编译工具链,pip 安装时又留下缓存和构建依赖。镜像大不仅推送慢、拉取慢,还扩大了攻击面。Docker 的多阶段构建(multi-stage build)正是为解决这个问题而生。
核心思路
多阶段构建允许在一个 Dockerfile 里定义多个 FROM 阶段:前面的阶段负责编译与安装,最后一个阶段只拷贝运行必需的产物。构建工具、源码、缓存都留在中间阶段,不会进入最终镜像。
一个可运行的例子
# 阶段一:安装依赖到独立目录
FROM python:3.12 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --prefix=/install -r requirements.txt
# 阶段二:只带运行时
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /install /usr/local
COPY . .
CMD ["python", "main.py"]
第一阶段用完整镜像编译安装依赖到 /install;第二阶段用 slim 镜像,仅拷贝 /install 和业务代码。gcc、pip 缓存等都不会出现在最终镜像里。
进一步瘦身的三个习惯
- 选 slim 基础镜像,注意 alpine 的 musl 与部分 wheel 不兼容;
- 合并 RUN 指令并在同一层清理缓存(rm -rf /var/lib/apt/lists/*);
- 用 .dockerignore 排除 .git、测试与文档,避免无关文件进入上下文。
小结
多阶段构建把构建环境和运行环境分离,是镜像瘦身最直接有效的手段。配合 slim 基础镜像与良好的分层习惯,把一个 1GB 的 Python 镜像压到 100MB 以内并不难。建议在 CI 里加一步镜像体积检查,防止体积回弹。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)