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环境变量?