我在创建Elastic Beanstalk环境时遇到错误
实例上的命令失败。返回码:1输出:(TRUNCATED)... ^ /var/app/ondeck/config/environment.rb:5:in
;WITH CTE_Parent AS ( SELECT Name,Teaches,COUNT(*) OVER() AS Parent_Count FROM @Teachers WHERE Name = 'Dave' ) SELECT T.Name FROM @Teachers AS T INNER JOIN CTE_Parent AS C ON C.Name <> T.Name AND C.Teaches= T.Teaches GROUP BY T.Name,C.Parent_Count HAVING COUNT(*) = C.Parent_Count
loading&#39; /opt/rubies/ruby-2.4.3/bin/bundle:23:in`&#39;任务:TOP =&gt; db:migrate =&gt;环境(通过运行任务查看完整跟踪 - 跟踪)。挂钩/opt/elasticbeanstalk/hooks/appdeploy/pre/12_db_migration.sh失败。 有关更多详细信息,请使用控制台或EB检查/var/log/eb-activity.log CLI。
在/var/log/eb-activity.log文件中,我发现了以下错误 -
任务:TOP =&gt; db:migrate =&gt;环境(通过运行查看完整跟踪 任务--trace)(Executor :: NonZeroExitStatus)
AppDeployStage0 / AppDeployPreHook / 12_db_migration.sh]:活动失败。
AppDeployStage0 / AppDeployPreHook]:活动失败。
AppDeployStage0]:活动失败。
应用程序更新 - CommandCMD-AppDeploy失败
答案 0 :(得分:1)
在将Elastic Beanstalk与外部Amazon RDS数据库一起使用时,我遇到了同样的问题。基本上,问题是Elastic Beanstalk预部署脚本将尝试在数据库存在之前进行迁移。
我发现有两种方法可以解决这个问题。
第一种方法是在应用配置上设置RAILS_SKIP_MIGRATIONS=true
环境变量。这应该允许您至少部署代码库。之后,您可以使用eb ssh
封装到应用中,浏览到/var/app/current/
文件夹,然后手动运行bundle exec rails db:create
和bundle exec rails db:migrate
。
解决此问题的另一种方法是在/ opt / elasticbeanstalk / hooks / appdeploy / pre /文件夹中创建app预部署shell脚本挂钩文件。
我使用/opt/elasticbeanstalk/hooks/appdeploy/pre/12_db_migration.sh文件作为参考,这是我想出的。
在项目中创建一个名为/.ebextensions/0001_rails_db_create.config
的文件,其中包含以下内容:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/11_create_db.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
set -xe
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
RAKE_TASK="db:create"
. $EB_SCRIPT_DIR/use-app-ruby.sh
cd $EB_APP_STAGING_DIR
if su -s /bin/bash -c "bundle exec $EB_SCRIPT_DIR/check-for-rake-task.rb $RAKE_TASK" $EB_APP_USER; then
if [ "$RAILS_SKIP_DB_CREATE" = "true" ]; then
echo "Skipping database creation (RAILS_SKIP_DB_CREATE=true)."
else
su -s /bin/bash -c "leader_only bundle exec rake db:create" $EB_APP_USER
fi
else
echo "No $RAKE_TASK task in Rakefile, skipping database creation."
fi
将该文件提交到您的git仓库,然后运行eb deploy
。
这应该创建shell脚本钩子文件,如果它不存在,将创建rails db。数据库迁移shell脚本钩子文件应该在之后立即运行,因为它的名称以数字12开头。
完成此脚本后,如果您想绕过它,可以在应用上设置RAILS_SKIP_DB_CREATE=true
环境变量。