我正在使用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
在日志中,我看到部署后脚本试图运行,但是失败了。我没有收到有关该错误的任何其他信息,我唯一看到的是类似“错误: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
最佳答案
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
我希望这也能解决您的问题。
关于Django AWS Elastic Beanstalk迁移数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29540131/