在Elastic Beanstalk上部署后运行manage.py命令的正确方法?

时间:2016-02-26 17:16:23

标签: django amazon-web-services deployment elastic-beanstalk

我正在向EB部署一个Django应用程序 - 我的第一个EB部署 - 我对事情的顺序感到困惑。

我的容器命令是:

container_commands:
   01_migrate:
    command: "django-admin.py migrate"
    leader_only: true
   02_collectstatic:
     command: "django-admin.py collectstatic --noinput"
     leader_only: true

然而,我注意到,每次部署时,这些容器命令都在我的代码库上运行。假设我当前的代码是app-v1.zip。我更新了models.py,并创建了迁移。然后我eb deploy创建了app-v2.zipmigrate命令在EB环境中运行,但在app-v1.zip解压缩到app-v2.zip之前在旧代码库(/var/app/current)上运行,因此我的迁移不是&# 39; t applied。

如果我再运行另一个eb deploy,则会创建app-v3.zip,但会在migrate中的代码上运行app-v2.zip。所以,它有效,但这意味着我必须在我想要更改数据模型或静态文件的任何时候运行eb deploy两次(同样的问题适用于collectstatic)。

有更多解释和解决方法on this blog postthis SO question,但所有"将Django部署到EB"教程按照我container_commands的方式完成。

正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

你让我担心,但我已确认eb deploy确实使用新版本的代码运行命令。它在临时区域执行此操作,然后才真正释放到服务器,但它使用正确的版本。

您可以在部署后执行eb logs -a并查找eb-activity.log以查看所有命令的执行方式,并进行正确的迁移。

至于流程,我不喜欢将collecstatics称为EB流程的一部分,因为我使用基于gulp的流程将代码直接发布到S3(和CloudFront)中。所以,我只是在部署中运行迁移(以及我的应用程序特有的其他内容):

 01_migrate:
    command: "django-admin.py migrate --noinput"
    leader_only: true

一切都按预期工作。