Docker镜像体积过大(6.9GB)求助:如何优化Streamlit应用镜像?
解决Docker镜像体积过大的问题
你在MacBook M1环境下执行docker buildx build --no-cache --platform=linux/amd64 -t app:v1.0.0 .构建Streamlit应用镜像时,6.9GB的体积主要来自依赖安装层(6.73GB),可以通过以下几个方向优化:
一、清理APT缓存与冗余系统包
你的Dockerfile中安装ffmpeg libsm6 libxext6后未清理APT缓存,会额外占用数百MB空间。修改安装命令,在同一RUN指令中完成清理:
RUN pip3 install --no-cache-dir -r requirements.txt && \ apt-get update && apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \ apt-get clean && rm -rf /var/lib/apt/lists/*
--no-install-recommends会避免安装不必要的依赖包,进一步减少体积。
二、移除不必要的Python依赖
查看你的requirements.txt,存在明显冗余:
- 同时包含
pypdf和PyPDF2,二者功能重叠,保留一个即可 grpcio-tools、Faker、markdown-it-py等可能是开发阶段依赖,生产环境无需安装- 用
pipdeptree分析依赖树,找出未被直接使用的间接依赖并移除
建议先在本地环境用pip check验证依赖必要性,再精简requirements.txt。
三、删除无用的venv配置
Docker容器本身就是隔离环境,python -m venv venv完全多余,这一步会额外生成17.2MB的文件,直接删除该RUN指令即可。
四、使用多阶段构建(核心优化)
多阶段构建可以将编译/安装过程与最终运行环境分离,只保留必要的文件到最终镜像中。以下是优化后的Dockerfile:
# 第一阶段:构建依赖 FROM python:3.10.0-slim AS builder WORKDIR /build # 安装系统依赖(仅安装必要的编译/运行依赖) RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ ffmpeg libsm6 libxext6 \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . # 将依赖安装到指定目录,方便后续复制 RUN pip install --no-cache-dir --target=/build/deps -r requirements.txt # 第二阶段:最终运行镜像 FROM python:3.10.0-slim WORKDIR /app # 复制系统依赖库(从构建阶段复制必要的二进制文件) COPY --from=builder /usr/lib/x86_64-linux-gnu/libsm.so.6 /usr/lib/x86_64-linux-gnu/ COPY --from=builder /usr/lib/x86_64-linux-gnu/libxext.so.6 /usr/lib/x86_64-linux-gnu/ COPY --from=builder /usr/bin/ffmpeg /usr/bin/ffmpeg # 复制Python依赖到系统site-packages目录 COPY --from=builder /build/deps /usr/local/lib/python3.10/site-packages # 复制应用代码与配置(先复制小文件,利用Docker缓存) COPY .env .env COPY requirements.txt . COPY . /app ENV PYTHONUNBUFFERED=1 EXPOSE 8501 ENTRYPOINT ["streamlit", "run"] CMD ["Home.py", "--server.port=8501"]
五、针对大体积依赖的专项优化
你的依赖中torch、torchvision、opencv-python、pyarrow是体积大户:
- 若无需GPU支持,安装CPU版本:
torch==2.2.0+cpu --index-url https://download.pytorch.org/whl/cpu torchvision==0.17.0+cpu --index-url https://download.pytorch.org/whl/cpu - 替换
onnxruntime为onnxruntime-cpu opencv-python可以替换为更小的opencv-python-headless(无需GUI支持)
六、添加.dockerignore文件
创建.dockerignore排除不必要的文件,避免COPY指令将冗余内容打包进镜像:
.git/ __pycache__/ venv/ tests/ *.log .DS_Store
完成以上优化后,重新执行构建命令,镜像体积可大幅降低(预计能压缩到2GB以内,甚至更小,取决于依赖精简程度)。
内容的提问来源于stack exchange,提问作者Dom R.
相关产品推荐
相关产品推荐

