如何在AWS Elastic Beanstalk应用程序上调用db:seed?

时间:2013-01-17 03:08:57

标签: ruby-on-rails-3 amazon-web-services elastic-beanstalk

我知道您可以在每次部署中运行任务,但我只想引导数据库一次。

5 个答案:

答案 0 :(得分:12)

克里斯蒂安的答案很接近,但你还应该补充:

container_commands:
  seeddb:
    command: 'export HOME=/root; rake db:seed'
    leader_only: true

因此,DB仅从1个EC2实例播种,而不是同时播放所有这些实例。根据您的EB部署/版本,export HOME可能需要也可能不需要。

答案 1 :(得分:5)

我使用此地址提供的信息创建了一个脚本,该脚本将在迁移后和每次部署后运行:http://www.emind.co/how-to/how-to-run-rake-dbseed-in-amazon-elastic-beanstalk

我更喜欢这种方法,以便我可以跟踪EC2实例上的文件。当我最初在我的旧服务器(运行Linux< 1.0.9)上部署它时,我没有任何问题。但是,我最近不得不将服务器机器升级到运行Ruby 2.0(Puma)的64位Amazon Linux 2014.03 v1.0.9,并且脚本开始失败。如果您使用不同的Linux版本,它可能会失败。

这里的关键是你的rake命令的 / usr / local / bin / 以使用正确的rake。我直接从/ opt / elasticbeanstalk / hooks / appdeploy / pre /中找到的其他脚本中获取了这个:

#.ebextensions/db_seed.config
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/13_db_seed.sh":
    mode: "00755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/containerfiles/envvars
      cd $EB_CONFIG_APP_ONDECK
      su -c "leader_only /usr/local/bin/rake db:seed" $EB_CONFIG_APP_USER ||
      echo "Rake task failed to run, skipping seeding."
      true

应该注意的是,这个脚本仍然不正确,因为我没有运行"捆绑exec rake"如果您计划运行任何rake命令(这是AWS当前用于其他脚本的功能请求),这是非常值得建议的。如果你希望所有脚本在" rake"之前运行bundle exec。看一下这里发布的.config文件:https://github.com/alienfast/elastic-beanstalk

如果这仍然不适合您,我建议您使用正在运行您的应用的EC2实例之一,或者部署一个运行相同Linux / Ruby版本的新实例并导航到"的/ opt / elasticbeanstalk /钩/ appdeploy /前/"看看其他脚本在做什么。

我希望其他人觉得这很有用!

答案 2 :(得分:4)

要在弹性beanstalk实例上执行命令,您可以设置自定义命令配置,这些配置将在您更新应用程序时运行。 (In fact, there is a whole docs page dedicated to the different types of container commands you can do)。

  1. 如果您的应用程序根目录中没有.ebextensions目录,请创建一个。
  2. 您在此处输入的任何文件都将被运行。只要它以" .config"结束,就可以任意命名。 - 我任意命名为seed.config
  3. 借用 hfogel 写的内容,你可以像这样放一些东西:

    container_commands:
      01seed:
        command: rake db:seed
    
  4. 将此新代码添加到您的代表处:git add .然后git commit -m 'added seed config script'然后git push

  5. 然后将此新代码推送到您的aws eb实例:git aws.push
  6. 要验证您的命令是否实际运行,请进入弹性beanstalk控制台并展开环境的详细信息,然后导航到logs选项卡,刷新日志并查看它们。在那里,只需为{#1}}做种子"直到你看到种子命令运行。如果你不在某处看到它,那么它就没有了。

答案 3 :(得分:0)

我找到的唯一方法是ssh进入ec2实例并从/ var / app / current手动运行“rake db:seed RAILS_ENV = production”。

答案 4 :(得分:0)

问题问题已经有一段时间了,所以也许你已经弄明白了。无论如何,您可以在.beanstalk文件夹中添加一个名为(例如)seed.config的文件。输入这样的内容,你的种子就会运行:

container_commands:
  01seed:
    command: rake db:seed