如何在Elastic Beanstalk上正确安装Python应用自身包?
问题解答
1. 正确的部署方式
不需要额外的预部署脚本,直接在requirements.txt中添加一行来安装你的本地包即可:
# requirements.txt # 先列出其他依赖 requests==2.31.0 uvicorn==0.23.2 # 安装当前项目包 -e .
如果是生产环境,不需要可编辑安装模式,也可以直接写:
.
同时要确保pyproject.toml里正确配置了包的结构,让pip能识别到src目录下的模块:
[project] name = "package" version = "0.1.0" packages = [{ find = "package", where = "src" }]
这样Elastic Beanstalk在执行pip install -r requirements.txt时,会自动安装你的package模块,整个流程和本地开发一致,无需额外操作。
2. 预部署脚本失效的原因
你的脚本之所以没用,核心是钩子执行时机和EB的部署流程不匹配:
- Elastic Beanstalk的
predeploy钩子是在代码被复制到/var/app/staging目录后执行的,此时用pip install -e .安装的是/var/app/staging下的包(可编辑模式会创建指向该目录的软链接)。 - 但EB后续会把
/var/app/staging的内容移动到/var/app/current,这就导致虚拟环境中可编辑安装的包路径指向了已被清理的staging目录,运行时webapp用户执行应用自然找不到模块。 - 而你手动登录执行脚本时,是在
/var/app/current目录下操作的,此时安装的包指向正确的运行目录,所以能正常启动。
另外,脚本里的权限修改操作也没必要,EB默认会处理webapp用户的权限配置,过度修改反而可能引发其他问题。
内容的提问来源于stack exchange,提问作者tenazasr
相关产品推荐
相关产品推荐

