我正在尝试将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上。
答案 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
。