Python 在部署elastic beanstalk之前运行正确的脚本

Python 在部署elastic beanstalk之前运行正确的脚本,python,django,amazon-web-services,amazon-elastic-beanstalk,Python,Django,Amazon Web Services,Amazon Elastic Beanstalk,我正在编辑.ebextensions.config文件,以便在部署前运行一些初始化命令。我以为这些命令会在包含我的应用程序的解压缩.zip的同一文件夹中运行。但事实并非如此manage.py位于我的zip文件的根目录中,如果我执行以下命令: 01_collectstatic: command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"

我正在编辑
.ebextensions
.config文件,以便在部署前运行一些初始化命令。我以为这些命令会在包含我的应用程序的解压缩.zip的同一文件夹中运行。但事实并非如此
manage.py
位于我的zip文件的根目录中,如果我执行以下命令:

  01_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
我得到一个
错误:[实例:I-085e84b9d1df851c9]命令在实例上失败。返回代码:2输出:python:无法打开文件“manage.py”:[Errno 2]没有这样的文件或目录。

我可以执行
命令:“python/opt/python/current/app/manage.py collectstatic--noinput”
,但这将运行先前成功部署的
manage.py
,而不是运行正在部署的atm

我试图通过执行
命令来检查
.config
运行的命令的工作目录:“pwd”
,似乎pwd是
/opt/elasticbeanstalk/eb_infra
,它不包含我的应用程序

因此,我可能需要更改
$PYTHONPATH
以包含正确的路径,但我不知道它是哪条路径

在此示例中,用户向其.config文件添加了以下内容:

option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: myapp.settings
    PYTHONPATH: "./src"

因为他的
manage.py
位于zip根目录下的src文件夹中。在我的例子中,我会使用PYTHONPATH:“.”,但它不起作用。

因此,关于beanstalk需要记住的是,每个命令都是独立的,您不需要维护它们之间的状态。在本例中,有两个选项,将命令放入一个shell脚本中。或者,您可以编写一行命令,执行以您感兴趣的命令为前缀的所有有状态活动

e、 g


AWS支持解决了这个问题。以下是他们的答案:

当Beanstalk部署应用程序时,它会在处理EB扩展和钩子脚本时将应用程序文件保存在“暂存”目录中。一旦预部署脚本完成,应用程序就会移动到“生产”目录。您遇到的问题与执行“01_collectstatic”命令时“manage.py”文件不在预期位置有关

您的环境(Python 3.4,Amazon Linux 2017.03)的暂存位置为“/opt/Python/ondeck/app”

EB扩展“commands”部分在实际创建临时目录之前执行。要在创建临时目录后运行脚本,应使用“container_命令”。本节用于在提取应用程序之后,但在将其部署到生产目录之前修改应用程序。它将自动在暂存目录中运行您的命令

您能否尝试实现container_命令部分,看看它是否有助于解决您的问题?语法与此类似(但请在部署到生产环境之前进行测试):


谢谢你的信息。但主要问题是我不知道该使用哪个/path/to/django/opt/python/current/app包含以前成功部署的应用程序,如何在我现在尝试部署的应用程序中运行命令?
00_collectstatic:
    command: "pushd /path/to/django && source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput && popd"
container_commands:
  01_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"