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

Posted

技术标签:

【中文标题】在部署弹性 beantalk 之前运行正确的脚本【英文标题】:Run the right scripts before deployment elastic beanstalk 【发布时间】:2017-12-05 08:55:27 【问题描述】:

我正在编辑我的 .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 以包含正确的路径,但我不知道它是哪条路径。

在这个comment 中,用户将以下内容添加到他的.config 文件中:

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

因为他的manage.py 位于 zip 根目录下的 src 文件夹中。在我的情况下,我会做 PYTHONPATH: "." 但它不起作用。

【问题讨论】:

【参考方案1】:

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"

【讨论】:

【参考方案2】:

所以,关于 beanstalk 要记住的一点是每个命令都是独立的,并且您确实维护它们之间的状态。在这种情况下,您有两个选择,将您的命令放入 uploaded in the files section of ebextensions 的 shell 脚本中。或者,您可以编写一行命令来执行所有以您感兴趣的命令为前缀的有状态活动。

例如,

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

【讨论】:

感谢您提供的信息。但主要问题是我不知道使用哪个 /path/to/django 。 /opt/python/current/app 包含之前成功部署的应用程序,如何在我现在尝试部署的应用程序中运行命令?

以上是关于在部署弹性 beantalk 之前运行正确的脚本的主要内容,如果未能解决你的问题,请参考以下文章

Express + Webpack 弹性beantalk部署

Jenkins 部署到弹性 beantalk

将 django docker 容器部署到弹性 beantalk

通过弹性 beantalk 部署的 Node 应用程序的问题

升级弹性 beantalk 堆栈时,Rails 应用程序无法部署

尝试通过弹性 beantalk 运行救援时忽略 .ebextensions 文件