aww*_*ter 7 django amazon-web-services amazon-elastic-beanstalk
我正在使用Elastic Beanstalk将Django项目部署到AWS,但我仍然无法迁移数据库.
我在哪里:我能够成功部署我的django项目并通过mysubdomain.elasticbeanstalk.com加载页面.页面加载没有错误,直到我到达需要进行数据库调用的页面.然后我得到一个错误,relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user"因为我的数据库尚未迁移.
我尝试过的东西:我尝试了很多不同的东西.幸运的是,有大量的stackoverflow帖子和几个教程.不幸的是,他们似乎都在使用不同的版本,他们的建议并不适用于我的项目.
我很清楚,我需要在foobar.config文件.ebextensions/夹内的文件中运行迁移.这是我想要做的基础:
container_commands:
01_migrate:
command: "python manage.py migrate --noinput"
leader_only: true
Run Code Online (Sandbox Code Playgroud)
在日志中,我看到后部署脚本尝试运行但失败了.我没有收到有关错误的任何其他信息,我唯一看到的是"错误:01_migrate部署后脚本失败"
我发现我需要激活命令的虚拟环境,这是有道理的.从asdf我试试这个:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python rlg/manage.py migrate --noinput"
leader_only: true
Run Code Online (Sandbox Code Playgroud)
但它不起作用.事实上,通过SSH我发现我甚至没有/ opt/python /文件夹,只有/ opt/aws /和/ opt/elasticbeanstalk /.所有教程和SO问题都引用了这个文件夹,但我没有它?
版本:Python 3.4.1,Django 1.7.7,AWS CLI 3.2.1,Postgres 9.3
nkh*_*eys 13
我知道这是一个老帖子,但我想在这里发布我的答案,因为我花了很长时间才弄明白.
Sebastian指出了我正确的方向,但这种方法的问题是它在部署之前运行(所以你迁移旧代码)
您也可以files在ebextensions中使用该命令并将文件写入/ 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
Run Code Online (Sandbox Code Playgroud)
这将在正确的dir中创建一个post deploy脚本,并且仅在leader上创建.
这对我来说真的很好但是要注意,钩子目录是未记录的功能
container_commands不在docker容器中执行.它们直接在ec2实例上执行.目前我正在使用docker exec迁移.由于有关的docker容器是afaik,最后一个开始我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
Run Code Online (Sandbox Code Playgroud)
我希望这也能解决你的问题.
| 归档时间: |
|
| 查看次数: |
2573 次 |
| 最近记录: |