【问题标题】:Rails does not properly read environmental variables in database.ymlRails 没有正确读取 database.yml 中的环境变量
【发布时间】:2012-12-29 04:30:20
【问题描述】:

我的 database.yml 是这样设置的:

development:
  adapter: mysql2
  encoding: utf8
  database: devel
  username: root
  host: localhost
  port: 3306
  timeout: 5000

# ... snip ...

production:
  adapter: mysql2
  encoding: utf8
  database: prod
  username: <%= ENV["DB_USER"] %>
  password: <%= ENV["DB_PASSWORD"] %>
  host: <%= ENV["DB_HOST"] %>
  port: 3306
  timeout: 5000

问题是,尽管设置了我的环境变量,Rails 并没有正确读取这些变量。当我在 EC2 上启动 Phusion 支持的 Nginx 服务器时,我收到以下消息:

Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error)

我确认 Phusion 正在生产环境中启动 Rails;我将开发和测试配置中的用户名和主机更改为唯一名称,'root'@'localhost' 始终显示为错误消息。另外,如果我将用户名和密码硬编码到 YAML 文件中,服务器可以正常启动。

我怀疑我没有正确设置我的环境变量,因为 MySQL 一直声称我试图在没有密码的情况下以“root”身份登录。我最初将它们从 .bashrc 文件中导出,但在阅读 this question 之后,我意识到这不是正确的方法。找了一圈,偶然发现this blog post,于是按照说明创建了这三个文件:

/usr/local/etc/env

export RAILS_ENV=production
export DB_PASSWORD= (snip)
export DB_USER=doorbells

/usr/local/etc/ruby_wrapper

#!/bin/sh

source /usr/local/etc/env
exec /home/rooby/.rvm/wrappers/ruby-1.9.3-p362@doorbells-dev/ruby "$@"

/etc/profile.d/env.sh

#!/bin/sh

source /usr/local/etc/env

在我的 nginx.conf 文件中,我使用了这一行:

passenger_ruby /usr/local/etc/ruby_wrapper;

我重新启动了我的服务器,但无济于事。有什么想法吗?

【问题讨论】:

  • 只是猜测,但您需要使用 database.yml.erb
  • 很遗憾,没用。该文件需要命名为“database.yml”。
  • @gorelative 可以在 YAML 文件中插入变量
  • 这应该可以工作,或者至少可以在本地使用 Foreman 和 Webbrick。

标签: database ruby-on-rails-3 environment-variables passenger


【解决方案1】:

上述解决方案对我不起作用。但是,我找到了解决方案 How do I use variables in a YAML file?

我的 .yml 文件包含以下内容:

development:
gmail_username: <%= ENV["GMAIL_USERNAME"] %>
gmail_password: <%= ENV["GMAIL_PASSWORD"] %>

解决方案如下:

template = ERB.new File.new("path/to/config.yml.erb").read
processed = YAML.load template.result(binding)

所以当你在 .yml 文件中引入 scriptlet 标签时,它更像是 erb 模板。所以先把它读成erb模板,然后再加载yml如上图。

【讨论】:

    【解决方案2】:

    我在 Ubuntu 12.04 上遇到了同样的问题。

    在我看到的 nginx 错误日志 (/var/log/nginx/error.log/) 中,

    [ ... ]: [App 8509 stderr] /path/to/ruby_wrapper.sh: 2: /path/to/ruby_wrapper.sh: 
    [ ... ]: [App 8509 stdout] 
    [ ... ]: [App 8509 stderr] source: not found
    

    /bin/sh 似乎看不懂source 命令。因此,我将其更改为简单的.,其作用相同。

    完全更改后的ruby_wrapper.sh 如下所示:

    #!/bin/sh
    
    . /usr/local/etc/env
    exec /home/rooby/.rvm/wrappers/ruby-1.9.3-p362@doorbells-dev/ruby "$@"
    

    这对你有帮助吗?

    【讨论】:

    • 嗯,我确实记得将我的 Rails 应用程序部署到运行 Ubuntu 12.04 LTS 的 EC2 实例上。我不再真正做 Rails 了,但我会尝试你的解决方案来关闭。惊讶的人们仍在挖掘这个问题。 :)
    【解决方案3】:

    首先,使用

    username: ENV["DB_USER"]
    password: ENV["DB_PASSWORD"]
    host: ENV["DB_HOST"]
    

    改为

    username: <%= ENV["DB_USER"] %>
    password: <%= ENV["DB_PASSWORD"] %>
    host: <%= ENV["DB_HOST"] %>
    

    【讨论】:

    • 这是不正确的。 database.yml 被评估为 ERB 模板,因此他绝对应该使用&lt;%= %&gt; 语法。
    • @Hongli 除非您使用 HAML,否则您需要使用字符串插值。
    • 这也不是真的。 database.yml总是被评估为 ERB 模板。视图是否使用 HAML 并不重要。
    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2018-07-30
    相关资源
    最近更新 更多