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"
的错误,因为我的数据库尚未迁移。
我尝试过的方法:我尝试过很多不同的方法。幸运的是,有大量的 Whosebug posts 和一些教程。不幸的是,他们似乎都在使用不同的版本,他们的建议不适用于我的项目。
我很清楚,我需要 运行 在 .ebextensions/
文件夹内的 foobar.config
文件中进行迁移。这是我想做的事情的基础:
container_commands:
01_migrate:
command: "python manage.py migrate --noinput"
leader_only: true
在日志中,我看到 post 部署脚本尝试 运行 但失败了。我没有收到关于错误的任何其他信息,我唯一看到的是 "ERROR: 01_migrate post deployment script failed"
我发现我需要为命令激活虚拟环境,这是有道理的。从 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 问题都引用此文件夹,但我没有?
版本:
Python3.4.1、Django 1.7.7、AWS CLI 3.2.1、Postgres 9.3
container_commands 未在 docker 容器中执行。它们直接在 ec2 实例上执行。
目前我正在使用 docker exec
进行迁移。由于相关的 docker 容器是最后一个启动的容器,我使用 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
希望这也能解决您的问题。
我知道这是一个旧的 post 但我想 post 我的答案在这里,因为我花了很长时间才弄明白。
Sebastian 为我指出了正确的方向,但这种方法的问题是部署前 运行s(所以你迁移了旧代码)
您还可以在 ebextensions 中使用 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
这将在正确的目录中创建一个 post 部署脚本,并且仅在领导者上。
这对我来说效果很好,但请注意,挂钩目录是 un-documented 个功能
正在更新有关最新 Elastic Beanstalk 版本的信息。
我正在使用 64bit Amazon Linux 2016.09 v2.3.3 running Python 3.4
。
以下命令对我有用,无需激活 virtualenv
或创建 post 应用程序部署挂钩。
container_commands:
01_migrate_db:
command: "python manage.py db upgrade" <-- insert your migration command here
leader_only: true
为了证明 container commands
将在 post 部署阶段执行,我更改了我的模型,生成了更新的迁移脚本,部署了新版本并进行了检查如果数据库迁移成功:Success!
我正在使用 Elastic Beanstalk 将 Django 项目部署到 AWS,但在迁移数据库时卡住了。
我所在的位置: 我能够成功部署我的 django 项目并通过 mysubdomain.elasticbeanstalk.com 加载页面。页面加载没有错误,直到我到达需要进行数据库调用的页面。然后我收到类似 relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user"
的错误,因为我的数据库尚未迁移。
我尝试过的方法:我尝试过很多不同的方法。幸运的是,有大量的 Whosebug posts 和一些教程。不幸的是,他们似乎都在使用不同的版本,他们的建议不适用于我的项目。
我很清楚,我需要 运行 在 .ebextensions/
文件夹内的 foobar.config
文件中进行迁移。这是我想做的事情的基础:
container_commands:
01_migrate:
command: "python manage.py migrate --noinput"
leader_only: true
在日志中,我看到 post 部署脚本尝试 运行 但失败了。我没有收到关于错误的任何其他信息,我唯一看到的是 "ERROR: 01_migrate post deployment script failed"
我发现我需要为命令激活虚拟环境,这是有道理的。从 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 问题都引用此文件夹,但我没有?
版本: Python3.4.1、Django 1.7.7、AWS CLI 3.2.1、Postgres 9.3
container_commands 未在 docker 容器中执行。它们直接在 ec2 实例上执行。
目前我正在使用 docker exec
进行迁移。由于相关的 docker 容器是最后一个启动的容器,我使用 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
希望这也能解决您的问题。
我知道这是一个旧的 post 但我想 post 我的答案在这里,因为我花了很长时间才弄明白。
Sebastian 为我指出了正确的方向,但这种方法的问题是部署前 运行s(所以你迁移了旧代码)
您还可以在 ebextensions 中使用 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
这将在正确的目录中创建一个 post 部署脚本,并且仅在领导者上。
这对我来说效果很好,但请注意,挂钩目录是 un-documented 个功能
正在更新有关最新 Elastic Beanstalk 版本的信息。
我正在使用 64bit Amazon Linux 2016.09 v2.3.3 running Python 3.4
。
以下命令对我有用,无需激活 virtualenv
或创建 post 应用程序部署挂钩。
container_commands:
01_migrate_db:
command: "python manage.py db upgrade" <-- insert your migration command here
leader_only: true
为了证明 container commands
将在 post 部署阶段执行,我更改了我的模型,生成了更新的迁移脚本,部署了新版本并进行了检查如果数据库迁移成功:Success!