Heroku部署Flask应用遇slug过大,求缩减/app/.heroku体积方案
问题:Heroku部署Flask应用时Slug过大,
/app/.heroku目录占用空间过高 部署Python(Flask)应用到Heroku时遇到slug size is too large错误,执行空间分析命令后发现/app/.heroku目录占用了266M空间:
$ du -ha --max-depth 1 /app | sort -hr 286M /app 266M /app/.heroku 14M /app/.apt 6.9M /app/lang 24K /app/.profile.d 8.0K /app/requirements.txt 4.0K /app/runtime.txt 4.0K /app/requirements.in 4.0K /app/README.md 4.0K /app/Procfile 4.0K /app/Aptfile
想知道如何缩减/app/.heroku的大小,听说该目录存储Python二进制文件,具体操作方法是什么?
补充应用依赖列表:
beautifulsoup4==4.12.3 certifi==2022.12.7 Flask==3.0.3 Flask_Cors==4.0.0 flask_mailman==1.1.0 flask_session==0.8.0 google_api_python_client==2.122.0 numpy==1.26.4 openai==1.30.1 protobuf==5.26.1 pymongo==4.6.2 python_bcrypt==0.3.2 qdrant_client==1.9.1 Requests==2.32.2 sentence_transformers==2.4.0 spacy==3.7.4 stripe==8.7.0
解决方法
清理Python构建缓存
/app/.heroku/python子目录存储了Python运行时和依赖的构建缓存,可通过添加Heroku官方的清理构建包自动移除冗余文件:
在requirements.txt末尾追加以下内容:-e git+https://github.com/heroku/heroku-buildpack-python.git#egg=clean这样构建过程会自动清理不必要的缓存文件,缩小
/.heroku目录体积。优化依赖包,移除冗余数据
你的依赖中有几个体积较大的包,针对性优化:sentence_transformers和spacy会自带预训练模型,这些模型很占空间。可以改成部署后动态下载模型,或者把模型存到外部存储(如对象存储服务),不要打包进slug。numpy等科学计算包的二进制文件体积不小,确认当前版本是否为必需,尝试降级到兼容的更小版本(注意验证功能正常)。- 用
pip check和手动排查,移除未实际使用的依赖包。
使用轻量Python运行时
在runtime.txt中指定具体的最新小版本Python(比如python-3.11.9),避免使用通用版本带来的冗余文件。最新版本的Python运行时通常会优化二进制文件大小。自定义构建后清理步骤
添加构建后脚本,删除依赖包中的冗余文件:
比如在项目根目录创建post_compile脚本(赋予可执行权限),内容如下:#!/bin/bash # 删除依赖中的文档、测试文件 find /app/.heroku/python/lib/python*/site-packages -name "tests" -type d | xargs rm -rf find /app/.heroku/python/lib/python*/site-packages -name "*.md" -o -name "*.rst" | xargs rm -rf # 删除多余的编译文件 find /app/.heroku/python/lib/python*/site-packages -name "__pycache__" -type d | xargs rm -rf这样构建完成后会自动清理这些不必要的文件。
排查
/.heroku下的具体大目录
登录Heroku容器查看/.heroku的子目录分布:heroku run bash du -ha --max-depth 2 /app/.heroku | sort -hr如果发现
/.heroku/builds等遗留构建目录,可以在post_compile脚本中添加删除命令清理它们。
内容的提问来源于stack exchange,提问作者bobthebuilder
相关产品推荐
相关产品推荐

