在部署弹性 betalk 之前运行正确的脚本



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

01_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"

我得到一个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 的。

我试图通过执行command: "pwd"来检查.config运行的命令的工作目录是什么,似乎 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: "."但它不起作用。

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"

因此,关于 beanstalk 要记住的是,每个命令都是独立的,并且您不会在它们之间维护状态。 在这种情况下,您有两种选择,将命令放入 shell 脚本中,该脚本上传到ebextensionsfiles部分中。 或者,您可以编写一行命令来执行以感兴趣的命令为前缀的所有有状态活动。

例如,

00_collectstatic:
command: "pushd /path/to/django && source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput && popd"

最新更新