在部署Elastic beantalk之前运行正确的脚本

Joã*_*tes 3 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"
Run Code Online (Sandbox Code Playgroud)

我得到一个 ERROR: [Instance: i-085e84b9d1df851c9] Command failed on instance. Return code: 2 Output: python: can't open file 'manage.py': [Errno 2] No such file or directory.

我可以做,command: "python /opt/python/current/app/manage.py collectstatic --noinput"但是那样可以运行manage.py先前已成功部署的,而不是运行正在atm部署的。

我试图通过检查运行命令的工作目录是.config什么command: "pwd",看来pwd是/opt/elasticbeanstalk/eb_infra不包含我的应用程序的目录。

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

在此注释中,用户将以下内容添加到他的.config文件中:

option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: myapp.settings
    PYTHONPATH: "./src"
Run Code Online (Sandbox Code Playgroud)

因为他的manage.py生活在zip根目录内的src文件夹中。就我而言,我会做,PYTHONPATH: "."但是不起作用。

Joã*_*tes 6

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

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

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

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

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

container_commands:
  01_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
Run Code Online (Sandbox Code Playgroud)