我正在尝试在 Elastic Beanstalk 上部署 Python 应用程序。我知道如何安装 other Python 要求(即使用
requirements.txt
),但我不确定安装应用程序包本身的最佳方法。
我的项目结构如下:
project
|- .ebextensions/
|- .platform
|- requirements.txt
|- pyproject.toml
|- Procfile
|- src/
| |- package
| | |- __init__.py
| | |- file.py
Procfile
看起来像这样:
web: uvicorn package.main:app --workers=4 --port 8000
并且 pyproject.toml 正确安装包(本地),这样我就可以做
python -c "import package"
无错误(来自任何目录)。
但是,应用程序无法部署,并出现以下错误:
<time> <ip> web[9080]: ModuleNotFoundError: No module named 'package'
我尝试将预部署脚本放入
.platform/hooks/predeploy/pip.sh
中,如下所示:
#!/bin/bash
source /var/app/venv/*/bin/activate
pip install -e .
chown -R webapp .
chown -R webapp /var/app/venv/
它运行没有错误(检查
/var/log/eb-hooks.log
),但它似乎没有修复错误。奇怪的是,我在 pip list
上看到了我的包,但导入它会引发错误。
如果我
eb ssh
并 sudo 运行上面的脚本,它就可以工作,并且我可以以 webapp
用户身份毫无问题地运行应用程序,这更令人困惑!但是,在eb deploy
之后我仍然无法拥有一个可以工作的应用程序,除非我手动进入并运行脚本。
这让我想到以下问题:
我想通了:您可以在
requirements.txt
中包含本地路径依赖项,例如:
这将安装包和子包:
file: .
file: ./subpackage
但是,请确保您没有阅读 setup.py 或类似文件中的requirements.txt!