我知道您可以将任务作为每次部署的一部分运行,但我只想引导数据库一次。
Kristian的答案很接近,但你还应该加上:
container_commands:
seeddb:
command: 'export HOME=/root; rake db:seed'
leader_only: true
这样DB只从一个EC2实例中播种,而不是同时从所有的EC2实例中播种。根据您的EB部署/版本,可能需要也可能不需要export HOME
。
我使用此地址提供的信息创建了一个脚本,该脚本将在迁移后和每次部署后运行:http://www.emind.co/how-to/how-to-run-rake-dbseed-in-amazon-elastic-beanstalk
我更喜欢这种方法,这样我就可以跟踪EC2实例上的文件。当我最初在我的旧服务器(运行Linux <1.0.9)上部署它时,我没有遇到任何问题。然而,我最近不得不将服务器机器升级到64位Amazon Linux 2014.03 v1.0.9,运行Ruby 2.0 (Puma),脚本开始失败。如果您使用不同的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
应该注意的是,这个脚本仍然是不正确的,因为我没有运行"bundle exec rake",如果你计划运行任何rake命令,这是强烈建议的(这是AWS上当前对其他脚本的功能请求)。如果您希望所有脚本在"rake"之前运行bundle exec,请查看这里发布的.config文件:https://github.com/alienfast/elastic-beanstalk
如果这仍然不适合你,我建议你的一个EC2实例运行你的应用程序,或部署一个新的运行相同的Linux/Ruby版本,并导航到"/opt/elasticbeanstalk/hooks/appdeploy/pre/",看看其他脚本在做什么。
我希望其他人觉得这有用!
在您的elastic beanstalk实例上执行命令,您可以设置自定义命令配置,这些配置将在更新应用程序时运行。(事实上,有一个完整的文档页面专门介绍您可以执行的不同类型的容器命令)。
- 如果你在应用程序的根目录下还没有
.ebextensions
目录,创建一个。 - 在这里输入的任何文件都将运行。命名为任何你想要的,只要它以"
.config
"结尾——我随意命名为seed.config
-
借用hfogel写的东西,你可以在那里放一些像这样的东西:
container_commands: 01seed: command: rake db:seed
-
将此新代码添加到您的repo:
git add .
然后git commit -m 'added seed config script'
然后git push
- 然后将此新代码推送到您的aws web实例:
git aws.push
要验证您的命令是否实际运行,请进入您的elastic beanstalk控制台,展开您环境的详细信息,导航到logs
选项卡,刷新日志并查看它们。在这里,只需对"seed"执行ctrl + f
,直到看到seed命令运行为止。如果你没有看到它,那么它就没有运行。
我发现的唯一方法是ssh到ec2实例并手动从/var/app/current运行"rake db:seed RAILS_ENV=production"
这个问题已经问了一段时间了,所以也许你已经明白了。无论如何,您可以添加一个名为(例如)seed的文件。在.beanstalk文件夹中配置。输入这样的内容,你的种子将运行:
container_commands:
01seed:
command: rake db:seed