Docker 镜像体积优化入门:几个实用瘦身技巧
很多同学第一次写 Dockerfile 时,构建出来的镜像动辄上 GB。镜像大不仅占用磁盘,还会拖慢推送、拉取和部署速度,在弹性扩容时尤其明显。其实只要掌握几个基本技巧,就能让镜像体积大幅下降。本文以一个简单的 Python Web 应用为例,介绍三种最常用的优化方法。
一、选择更小的基础镜像
基础镜像决定了镜像的“底座”大小。以 Python 为例,官方的 python:3.12 镜像基于完整的 Debian,体积接近 1GB;而 python:3.12-slim 只保留运行所需的最少系统包,体积约 150MB 左右。对大多数应用来说,slim 版本已经足够。Alpine 版本更小,但它使用 musl libc,部分依赖 C 扩展的库可能需要自行编译,新手建议优先选择 slim。
二、减少层数并清理缓存
Dockerfile 中每条 RUN 指令都会生成一个新的镜像层。如果在一条 RUN 里下载文件、在下一条 RUN 里删除,文件依然保留在前一层中,镜像并不会变小。正确做法是把安装和清理写在同一条指令里,例如:
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir -r requirements.txt
其中 --no-install-recommends 避免安装推荐但非必需的软件包,--no-cache-dir 让 pip 不保留下载缓存。
三、使用多阶段构建
编译工具、构建依赖只在构建时需要,运行时完全用不到。多阶段构建允许我们在第一个阶段完成构建,再把产物复制到一个干净的镜像里:
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /install /usr/local
COPY . .
CMD ["python", "app.py"]
最终镜像只包含第二阶段的内容,构建阶段的中间文件不会被带进来。对于 Go、Java 等需要编译的语言,效果更加明显,Go 程序甚至可以只保留一个二进制文件。
四、别忘了 .dockerignore
COPY . . 会把构建上下文中的所有文件复制进镜像,包括 .git 目录、本地虚拟环境和日志文件。在项目根目录添加 .dockerignore 可以把它们排除:
.git
__pycache__/
*.log
.venv/
五、检查优化效果
优化完成后,可以用以下命令查看效果:
- docker images:查看镜像总体积;
- docker history 镜像名:查看每一层的大小,找出“胖”层;
- 对比优化前后的拉取时间,感受部署速度的变化。
总结一下:选小底座、合并指令并清理缓存、多阶段构建、配置 .dockerignore,这四步做完,大多数镜像都能瘦身一大半。把优化后的镜像推送到容器镜像服务 SWR,部署到云上时拉取会更快、更省流量。
- 点赞
- 收藏
- 关注作者
评论(0)