【问题标题】:Rails doesn't see environment variableRails 看不到环境变量
【发布时间】: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 来查看进程的环境变量。对调试这类事情很有帮助。

标签: ruby-on-rails ruby ubuntu unicorn


【解决方案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 也是如此。
            猜你喜欢
            • 2021-10-20
            • 2019-03-01
            • 2018-02-17
            • 2015-05-10
            • 1970-01-01
            • 2016-10-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多