Rails 看不到环境变量

Posted

技术标签:

【中文标题】Rails 看不到环境变量【英文标题】:Rails doesn't see environment variable 【发布时间】:2016-07-30 06:45:29 【问题描述】:

我正在尝试将 Rails 应用程序转移到生产环境中,但 Rails 出现问题,无法看到我的环境变量。

我的 .bashrc 文件中有数据库设置的密码,例如

export APP_NAME_DATABASE_PASSWORD=secretkey

在 irb 中

ENV["APP_NAME_DATABASE_PASSWORD"]

返回secretkey

使用

RAILS_ENV=production rails c

只是

rails c

返回 secretkey 但在启动应用程序时我得到了

Access is denied (using password: NO)

我在“How To Deploy a Rails App with Unicorn and nginx on Ubuntu 14.04”上使用稍微修改过的初始化脚本版本来启动独角兽。

它托管在 Ubuntu Server 14.04 上。

【问题讨论】:

你在哪里部署它?赫罗库?谷歌云? AWS? 到我自己的使用 Ubuntu 14.04 的服务器,我会添加它。 LPT:您可以通过查看/proc/PID/environ 来查看进程的环境变量。对调试这类事情很有帮助。 【参考方案1】:

或者你忘记安装gem 'dotenv-rails'¯_(ツ)_/¯

【讨论】:

【参考方案2】:

对于使用 zsh 的人:

echo 'export APP_NAME_DATABASE_PASSWORD=value' >> ~/.zshenv
source ~/.zshenv

检查是否真的设置了:

echo $APP_NAME_DATABASE_PASSWORD # value

对于运行 rails 应用程序,您可能还想使用spring stop

【讨论】:

【参考方案3】:

尝试执行spring stop,然后是rails c

Spring 是一个 Rails 应用程序预加载器,用于加载 ENV 配置。它可能没有加载您的案例中的.bashrc 更改。

【讨论】:

【参考方案4】:

这是另一种选择:

http://railsguides.net/how-to-define-environment-variables-in-rails/

把你的环境变量放到local_env.yml,然后把这个放到application.rb

  config.before_configuration do
    env_file = File.join(Rails.root, 'config', 'local_env.yml')
    YAML.load(File.open(env_file)).each do |key, value|
      ENV[key.to_s] = value.to_s
    end if File.exists?(env_file)
  end

【讨论】:

【参考方案5】:

我遇到了类似的问题。一个简单的解决方案是运行:

export RAILS_ENV=production && rails c

原因是不使用export的时候,rails看不到环境变量,但是在控制台执行echo就可以看到它的值。

【讨论】:

【参考方案6】:

export APP_NAME_DATABASE_PASSWORD=secretkey 很可能将您的环境变量范围限定为 bash 进程。由于 Unicorn 不作为 bash 进程的子进程运行,因此它无权访问此环境变量。

我建议将您的 ENV 变量存储在一个地方,例如 application.yml,并在应用程序开始时将它们加载到您的 ruby​​ 环境中。有一些很棒的工具可以做到这一点。我建议查看 Figaro:https://github.com/laserlemon/figaro。

这是与您的问题相关的另一篇文章:Re-source .bashrc when restarting unicorn?

【讨论】:

有没有办法将这些变量放在 Unicorns 范围内?或者这是一个坏主意? 可以,可以直接在启动独角兽的脚本中设置,也可以在unicorn.conf文件中设置。然而,这种方法的一个缺点是,rake 和 rails 控制台无法访问您的 ENV 变量。 我认为安东尼的解释可能是正确的。但我认为将 ENV 变量存储在 yml 文件中并不好。如果您这样做,则可能会将敏感信息提交给 SCM,这可能会导致漏洞。请看一下dotenv gem 我想这就是你要找的。​​span> 是的,不要提交 application.yml! dotenv 也是如此。

以上是关于Rails 看不到环境变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 3 中设置环境变量(设计 + Omniauth)

如何在 database.yml 文件中设置 rails 环境变量?

谁在运行Puma或Passenger时设置RAILS_MAX_THREADS环境变量?

Rails 5 将环境变量读取为 YAML 文件中的字符串

AWS Elastic Beanstalk RDS_DB_NAME 环境变量被忽略 (Rails 5)

如何在database.yml文件中设置rails环境变量?