Rails没有看到环境变量

时间:2016-04-08 20:51:38

标签: ruby-on-rails ruby ubuntu unicorn

我正在尝试将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"上使用了稍微修改过的init脚本版本。开始独角兽。

它托管在Ubuntu Server 14.04上。

6 个答案:

答案 0 :(得分:6)

export APP_NAME_DATABASE_PASSWORD=secretkey最有可能将您的环境变量确定为bash进程。由于Unicorn不是作为bash进程的子进程运行的,因此它无法访问此环境变量。

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

以下是与您的问题相关的其他帖子:Re-source .bashrc when restarting unicorn?

答案 1 :(得分:1)

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

export RAILS_ENV=production && rails c

原因是,当您不使用导出时,rails看不到环境变量,但是在控制台上执行echo时会看到它的值。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这是另一种选择:

  

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

答案 4 :(得分:0)

尝试先进行spring stop,然后再进行rails c

Spring是用于加载ENV配置的Rails应用程序预加载器。在您的情况下,它可能尚未加载.bashrc更改。

答案 5 :(得分:0)

对于使用zsh的用户:

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

使用以下方法检查它是否确实设置过:

echo $APP_NAME_DATABASE_PASSWORD # value

对于正在运行的Rails应用程序,您可能还想做spring stop