[英]Django migration is not changing database in 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.