簡體   English   中英

Django AWS Elastic Beanstalk 遷移數據庫

[英]Django AWS Elastic Beanstalk migrate database

我正在使用 Elastic Beanstalk 將一個 Django 項目部署到 AWS,但一直在遷移數據庫。

我在哪里:我能夠成功部署我的 django 項目並通過 mysubdomain.elasticbeanstalk.com 加載頁面。 頁面加載沒有錯誤,直到我到達需要進行數據庫調用的頁面。 然后我收到一條錯誤消息,如relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user"因為我的數據庫尚未遷移。

我嘗試過的:我嘗試過很多不同的東西。 幸運的是,有大量的 stackoverflow 帖子和一些教程。 不幸的是,他們似乎都在使用不同的版本,他們的建議不適用於我的項目。

我很清楚,我需要在.ebextensions/文件夾內的foobar.config文件中運行遷移。 這是我想做的事情的基礎:

container_commands:
  01_migrate:
    command: "python manage.py migrate --noinput"
    leader_only: true

在日志中,我看到部署后腳本嘗試運行但失敗了。 我沒有收到有關該錯誤的任何其他信息,我唯一看到的是類似“錯誤:01_migrate 部署后腳本失敗”的信息

我發現我需要為命令激活虛擬環境,這是有道理的。 從 asdf 我試試這個:

container_commands:
  01_migrate:
    command: "source /opt/python/run/venv/bin/activate && python rlg/manage.py migrate --noinput"
    leader_only: true

但它不起作用。 事實上,通過 SSH 我發現我什至沒有 /opt/python/ 文件夾,只有 /opt/aws/ 和 /opt/elasticbeanstalk/。 所有教程和 SO 問題都引用此文件夾,但我沒有它?

版本:Python 3.4.1、Django 1.7.7、AWS CLI 3.2.1、Postgres 9.3

我知道這是一篇舊文章,但是我想在這里發布我的答案,因為我花了很長時間才弄清楚。

塞巴斯蒂安(Sebastian)向我指出了正確的方向,但是這種方法的問題是它在部署之前運行(因此您遷移了舊代碼)

您還可以在ebextensions中使用files命令並將files寫入/ opt / elasticbeanstalk / hooks / appdeploy / post,但這將在任何實例上運行

您可以將這兩件事合並為:

container_commands:
  01migrate:
    command: "mkdir -p /opt/elasticbeanstalk/hooks/appdeploy/post/ && echo -e '#!/bin/bash\ndocker exec `docker ps -a -q | head -n 1` python <path_to_code> migrate' > /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh && chmod +x /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh"
    leader_only: true

這將在正確的目錄中創建發布后腳本,並且僅在領導者上創建。

這對我來說確實很好,但是請注意,鈎子目錄是未記錄的功能

container_commands不在docker容器內執行。 它們直接在ec2實例上執行。 目前,我正在使用docker exec進行遷移。 由於相關的docker容器是afaik,所以最后一個啟動了,所以我使用docker ps -a --no-trunc -q | head -n 1 docker ps -a --no-trunc -q | head -n 1獲取容器ID。

最后,我的setup.config看起來像這樣

container_commands:
  01syncdb:
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py syncdb --noinput  &>> /tmp/deploy.log"
    leader_only: true
  02migrate:
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py migrate --noinput  &>> /tmp/deploy.log"
    leader_only: true

我也希望能解決您的問題。

從所有實例運行遷移(簡單且經過測試)

Amazon Linux 2 平台為此類內容引入了已記錄的掛鈎。 將以下文件添加到位於<PROJECT_ROOT>/.platform/hooks/postdeploy/migrate.sh的項目中:

#!/bin/bash

docker exec `docker ps -a -q | head -n 1` python manage.py migrate

以下是文檔: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

僅從領導者運行遷移(未經測試)

要僅從領導者運行遷移,請嘗試這樣的事情:

.ebextensions/migrate.config

container_commands:
  touch_the_leader:
    command: touch /tmp/migrate
    leader_only: true

.platform/hooks/postdeploy/migrate.sh

#!/bin/bash

if [ -f /tmp/migrate ]; then
    docker exec `docker ps -a -q | head -n 1` python manage.py migrate
    rm /tmp/migrate
fi

更新有關最新Elastic Beanstalk版本的信息。

我正在使用64bit Amazon Linux 2016.09 v2.3.3 running Python 3.4

以下命令對我virtualenv而不必激活virtualenv或創建應用程序后部署鈎子。

container_commands:
  01_migrate_db:
    command: "python manage.py db upgrade" <-- insert your migration command here
    leader_only: true

為了證明container commands將在部署后階段執行,我對模型進行了更改,生成了更新的遷移腳本,部署了新版本,並檢查數據庫是否成功遷移:成功!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM