2016-02-26 111 views
0

我正在向EB部署一個Django應用程序 - 我的第一個EB部署 - 並且我對事物的順序感到困惑。在Elastic Beanstalk上進行部署之後運行manage.py命令的正確方法?

我的容器命令有這些:

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之前,因此我的遷移未應用。

如果我然後運行另一個eb deploy,它將創建app-v3.zip,但將在app-v2.zip的代碼上運行migrate。所以,它可以工作,但這意味着我需要每次運行eb deploy兩次以更改數據模型或靜態文件(同樣的問題適用於collectstatic)。

還有更多的解釋和解決方法on this blog postthis SO question,但所有的「部署Django到EB」教程都按照我使用container_commands的方式來完成。

什麼是正確的方法?

+0

確定嗎?我一直在使用EB一年,我從來沒有見過你描述的行爲。博客討論了這些命令在部署之前在臨時區域運行的事實,但臨時區域應該有您的新存檔。你能否提供更多關於你如何看待這種情況的細節? – dkarchmer

回答

0

你讓我擔心,但我已確認eb deploy確實使用新版本的代碼運行命令。在實際發佈到服務器之前,它會在臨時區域執行此操作,但它會使用正確的版本。

部署完成後可以執行eb logs -a並查找eb-activity.log以查看所有命令如何執行以及是否發生了適當的遷移。

至於流程,我更喜歡不把集合彙編作爲EB流程的一部分,因爲我使用基於流量的流程將代碼直接發佈到S3(和CloudFront)中。所以,我只需運行遷移作爲部署(加上其他的東西特別是我的應用程序)的一部分:

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

,一切都按預期工作。

相關問題