我正在向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.zip
。 migrate
命令在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 post和this SO question,但所有"将Django部署到EB"教程按照我container_commands
的方式完成。
正确的方法是什么?
答案 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
一切都按预期工作。