繁体   English   中英

Django在Amazon Elastic Beanstalk上的迁移命令被终止

[英]Django's migrate command on Amazon Elastic Beanstalk is killed

我正在使用亚马逊的Elastic Beanstalk和Django 1.8.2。 这是我的容器命令,

container_commands:
  01_wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
  02_makemigrations:
    command: "source /opt/python/run/venv/bin/activate && python manage.py makemigrations --merge --noinput"
    leader_only: true
  03_migrate:
    command: "source /opt/python/run/venv/bin/activate && python manage.py migrate --noinput"
    leader_only: true

由于某些原因, migrate命令被杀死。 即使在我的本地有一个新的数据库,所有迁移工作都很好。 但是以下是eb-activity.log上出现的错误。

Synchronizing apps without migrations:
  Creating tables...
  Running deferred SQL...
  Installing custom SQL...
  Running migrations:
  Rendering model states.../bin/sh: line 1: 21228 Killed                  python manage.py migrate --noinput
   (ElasticBeanstalk::ExternalInvocationError)

注意:相同的容器命令在Elastic Beanstalk中没有任何问题,工作正常。 我尝试使用--verbose 3 with migrate命令但没有得到任何其他调试消息。

有解决方案吗 提前致谢。

在使用较差的日志记录机制进行故障排除时,AWS对开发人员不友好。

作为最近为Django项目评估EBS的狂热AWS用户,出于同样的原因,我完全赞同这一点。 我最终和Heroku一起去了这个原因并且我不会进入,但我认为以下模式对任何一种方式都有帮助。

准备你的生产环境的步骤可以在不同的地方进行; 它们不必在您的目标Web服务器环境中发生。

我最终将我的make / migrate任务从我的部署自动化中拉出来,转移到之前发生的任务中。 我的目标Web服务器环境中发生的唯一事情与该服务器上的代码直接相关。

换句话说:如果您有用于构建/测试的CI工具,我建议您将make / migrate和任何其他准备工作拉到Web服务器之外的环境中,然后进入部署管道。 就像是:

  • 结帐代码
  • 运行测试(包括在临时数据库上进行make / migrate以在可能的情况下测试它)
  • 将应用程序置于维护模式(或类似,如果需要)
  • 快照数据库
  • 制作/迁移生产
  • 部署
  • 如果部署失败,则回滚DB,回滚应用程序。

然后,您将分离应用程序服务器的自动化问题和其他prod环境的自动化问题,并让CI处理该问题。 可以在同一个地方处理它们,但使用EBS的设施显然有点笨拙。

我的迁移被杀死了,因为Dockerrun.aws.json文件中保留的内存太低了。 文档中提供的示例给出了“128”作为样本值,我刚刚使用过它。 增加“内存”的值可以解决问题。

例如Dockerrun.aws.json摘录:

  "containerDefinitions": [
    {
      "name": "php-app",
      "image": "php:fpm",
      "essential": true,
      "memory": 512,
      // ... etc. ...
    }
  ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM