【发布时间】:2012-12-31 13:14:04
【问题描述】:
我知道您可以在每次部署时运行任务,但我只想引导数据库一次。
【问题讨论】:
标签: ruby-on-rails-3 amazon-web-services amazon-elastic-beanstalk
我知道您可以在每次部署时运行任务,但我只想引导数据库一次。
【问题讨论】:
标签: ruby-on-rails-3 amazon-web-services amazon-elastic-beanstalk
Kristian 的回答很接近,但您还应该补充:
container_commands:
seeddb:
command: 'export HOME=/root; rake db:seed'
leader_only: true
因此,数据库仅从 1 个 EC2 实例中播种,而不是同时从所有这些实例中播种。根据您的 EB 部署/版本,export HOME 可能需要也可能不需要。
【讨论】:
if 语句放在种子文件中,以便仅在数据库为空时运行种子。
我使用此地址提供的信息创建了一个脚本,该脚本将在迁移后和每次部署后运行:http://www.emind.co/how-to/how-to-run-rake-dbseed-in-amazon-elastic-beanstalk
我更喜欢这种方法,以便我可以跟踪 EC2 实例上的文件。当我最初在我的旧服务器(运行 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
如果这仍然对您不起作用,我建议您使用 SSH 连接到您正在运行您的应用程序的一个 EC2 实例,或者部署一个运行相同 Linux/Ruby 版本的新实例并导航到“/opt/elasticbeanstalk/ hooks/appdeploy/pre/" 以查看其他脚本在做什么。
我希望其他人觉得这很有用!
【讨论】:
要在弹性 beanstalk 实例上执行命令,您可以设置自定义命令配置,这些配置将在您更新应用程序时运行。 (In fact, there is a whole docs page dedicated to the different types of container commands you can do)。
.ebextensions 目录,请创建一个。.config”结尾就可以随意命名——我随意命名为seed.config
借用 hfogel 所写的内容,您可以在其中放置如下内容:
container_commands:
01seed:
command: rake db:seed
将此新代码添加到您的存储库中:git add . 然后git commit -m 'added seed config script' 然后git push
git aws.push
要验证您的命令是否实际运行,请进入您的弹性 beanstalk 控制台并展开您的环境的详细信息,然后导航到 logs 选项卡,然后刷新您的日志并查看它们。在那里,只需对“种子”执行ctrl + f,直到您看到您的种子命令已运行。如果你没有在某个地方看到它,那么它就没有运行。
【讨论】:
我发现的唯一方法是通过 ssh 进入 ec2 实例并从 /var/app/current 手动运行“rake db:seed RAILS_ENV=production”。
【讨论】:
rake db:seed RAILS_ENV=production /usr/bin/rake:9:in 'require': no such file to load -- rubygems (LoadError) from /usr/bin/rake:9
这个问题被问到已经有一段时间了,所以也许你已经想通了。无论如何,您可以在 .beanstalk 文件夹中添加一个名为(例如)seed.config 的文件。输入这样的内容,您的种子将运行:
container_commands:
01seed:
command: rake db:seed
【讨论】:
.beanstalk 文件夹是指.elasticbeanstalk 吗?另外,您是否必须eb stop 和eb start 才能生效?我将这些命令添加到了 seed.config 文件并执行了git aws.push,但播种并未显示在我的日志中