AWS Elastic Beanstalk 跳过 db:migrate,为 RAILS_SKIP_MIGRATIONS 获取错误值

问题描述 投票:0回答:3

我在 Elastic Beanstalk 上使用 Ruby 2.7,如 AWS 文档中所述。我正在运行 Rails 6.1.4.1。耙子是 13.0.6.

Beanstalk 是否执行

db:migrate
应该取决于
RAILS_SKIP_MIGRATIONS
的值,默认为false。我通过将它包含在我的
.ebextensions
设置中来双重确定它是真的,我看到它正在执行:

commands:
  01_install_yarn:
    command: npm install yarn -g
  02_symlink_yarn:
    command: ln -s -f "$(npm bin --global)"/yarn /usr/bin/yarn
  03_install_dependencies:
    command: yum install postgresql-devel
option_settings:
  aws:elasticbeanstalk:application:environment: 
    RAILS_SKIP_MIGRATIONS: false

事实上,我确定这个值是false,因为当我连接到它时,我可以在Beanstalk实例上看到它。

如果你通过 ssh 连接到主机并运行

sudo cat /opt/elasticbeanstalk/deployment/env
,你会看到环境的转储——所有这些配置参数,以及注入的 RDS 变量。非常方便调试:

$ sudo cat /opt/elasticbeanstalk/deployment/env
PATH=/opt/elasticbeanstalk/.rbenv/shims:/opt/elasticbeanstalk/.rbenv/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
RACK_ENV=production
RAILS_SKIP_MIGRATIONS=false
RAILS_SKIP_ASSET_COMPILATION=false
BUNDLE_WITHOUT=test:development
(etc)

然而,

/var/log/eb-engine.log
始终跳过迁移并显示:

2021/11/11 23:17:52.261630 [INFO] Running command /bin/su webapp -c bundle exec /opt/elasticbeanstalk/config/private/checkforraketask.rb db:migrate
2021/11/11 23:17:57.083890 [INFO] Found db:migrate task in Rakefile
2021/11/11 23:17:57.083955 [INFO] Skipping db:migrate task (RAILS_SKIP_MIGRATIONS=true).
2021/11/11 23:17:57.083968 [INFO] Executing instruction: configure log streaming

是真不是假!而且我一辈子都弄不明白为什么。

我可能会用

container_command
来回避这个问题以强制执行任务,但我真的很想知道发生了什么。这是 Beanstalk 中的错误吗?我似乎无法进一步追踪它;
checkforraketask
看起来像这样:

require 'rake'

Dir.chdir '/var/app/staging'

Rake.application.init
Rake.application.load_rakefile

tasks = Rake.application.tasks.collect(&:name)
exit 0 if tasks.include? ARGV[0]
exit 1

Rakefile
像这样:

require_relative "config/application"

Rails.application.load_tasks

lib/tasks
中没有任务,所以我假设此输出来自最后一行?我卡住了。如何让 Beanstalk 识别正确的值并运行迁移?

ruby-on-rails ruby linux amazon-web-services amazon-elastic-beanstalk
3个回答
1
投票

我也很想知道这个问题的答案

作为解决方法,我创建了以下 ebextension 来解决问题:

.ebextensions/03_rake-db-migrate.config

container_commands:
  rake_db_migrate:
    command: "RAILS_ENV=production bundle exec rake db:migrate"

0
投票

您是否正在跳过资产编译(RAILS_SKIP_ASSET_COMPILATION=true)?

就我而言,当为真时,迁移也在跳过。


0
投票

对我来说,我使用 Elastic Beanstalk“环境属性”(在配置下)设置

RAILS_SKIP_MIGRATIONS=false
。虽然它也没有被捡起来。

我使用此命令直接获取所有环境变量,并设置它们(默认情况下比 EB 早),现在它默认尊重该环境变量:

export $(cat /opt/elasticbeanstalk/deployment/env | xargs)

要在正确的时间运行,请将其放入如下文件中:

.platform/hooks/prebuild/09_fetch_env_vars_early.sh
,在文件顶部有一个 bash shebang,如下所示:
#!/bin/bash
.

要验证它是否有效,请查看

/var/log/eb-engine.log
,它应该如下所示:

[INFO] Found db:migrate task in Rakefile
[INFO] Running command /bin/su webapp -c bundle exec rake db:migrate

您可以使用

eb-engine.log
命令查看
eb logs
,或者在部署后通过
eb ssh
'ing到服务器。

© www.soinside.com 2019 - 2024. All rights reserved.