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

hea*_*xer 14 amazon-web-services ruby-on-rails-3 amazon-elastic-beanstalk

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

Pet*_*kas 12

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

container_commands:
  seeddb:
    command: 'export HOME=/root; rake db:seed'
    leader_only: true
Run Code Online (Sandbox Code Playgroud)

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

  • 没有'export HOME =/root;'这对我有用 一部分 (3认同)
  • 我仍然想知道这将只会使数据库播种一次,这些命令是否应该在每次上传新的应用程序版本时运行?(AFAIK leader_only是为了避免多个实例同时运行相同的命令,这是另一回事) (2认同)

Deu*_*a25 5

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

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

这里的关键是/ usr/local/bin /你的rake命令使用正确的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
Run Code Online (Sandbox Code Playgroud)

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

如果这还不为你工作,我建议ssh方式连接到运行你的应用程序,或部署一个新的运行相同的Linux/Ruby的版本,并定位到"/选择/ elasticbeanstalk /钩/ appdeploy您的EC2实例之一/ pre /"查看其他脚本正在做什么.

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


小智 0

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

  • 这不起作用: `rake db:seed RAILS_ENV=product /usr/bin/rake:9:in 'require': no such file to load -- ruby​​gems (LoadError) from /usr/bin/rake:9` (2认同)