2017-01-09 47 views
0

我有一个托管在ec2实例上的rails应用程序(rails 3.2.1,ruby 1.9.3以防万一)。在部署到新实例时,由于没有种子,部署失败,并且预部署脚本(12_db_migrate.sh)首先运行,导致其失败。手动播种数据库,然后运行迁移修复它。如何在elasticbeanstalk上执行自定义预部署脚本?

我想在.ebextensions下创建一个预部署脚本(我不想在... appdeploy/pre /下手动创建脚本,因为当我将该应用程序部署到新实例时, )今天这可能吗? PS:我知道我不希望它在每次部署时都播种,所以我正在考虑通过环境变量来实现这一目标。

回答

0

你可以告诉弹性青苗像

container_commands: 
    01_node_install_if_not_installed: 
    cwd: /tmp 
    test: '[ ! -f /usr/bin/node ] && echo "node not installed"' 
    command: 'echo "e" > tst.txt' 
    leader_only: true 
  • cwdtestleader_only运行container_commands前展开,通过添加含有一些文件.ebextensions/packages.config是可选的。
  • command如果test判断为真
  • leader_only设置是否做第一个EC2实例(如果你使用多个)

PS将只运行!您不能使用eb setenv来设置在此阶段应采取行动的环境变量,因为这些环境变量由webapp-user使用,而这些命令是以root身份运行的。

+0

container_commands在appdeploy/pre hooks执行后执行。这不是我想要的。 – user2076106

1

我认为最好的选择可能是重新评估,为什么你的迁移依赖于特定的数据被先前接种的,但无论我相信你可以做到你通过files关键想要什么。

像这样的东西可能会诀窍 - 我复制12_db_migration.sh并修剪它只是做种子。通过将前缀设置为09_它将在迁移之前运行。

files: 
    "/opt/elasticbeanstalk/hooks/appdeploy/pre/09_seed_database.sh": 
    mode: "000755" 
    owner: root 
    group: root 
    content: | 
     #!/usr/bin/env bash 

     EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir) 
     EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir) 
     EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user) 
     EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir) 

     . $EB_SUPPORT_DIR/envvars 

     . $EB_SCRIPT_DIR/use-app-ruby.sh 

     cd $EB_APP_STAGING_DIR 

     su -s /bin/bash -c "leader_only bundle exec rake db:seed" $EB_APP_USER 
+0

我同意你评论的第一部分,即迁移需要重新评估。我对Ruby on Rails相当陌生,但我可以说代码处于非常混乱的状态。我曾尝试使用“文件”键,因为您已经提到过,但它仍然继续并首先运行迁移并失败(我确实验证了YAML)。无论如何,我最终将种子作为迁移来执行(我知道它是一种黑客,但它看起来是我能想到的所有其他自动化方法中最干净的)。 – user2076106

相关问题