无法访问“database.yml”文件中的环境变量
Posted
技术标签:
【中文标题】无法访问“database.yml”文件中的环境变量【英文标题】:Failing to access environment variables within `database.yml` file 【发布时间】:2012-01-30 22:55:04 【问题描述】:我的development.yml
文件有以下开发部分:
development:
adapter: postgresql
host: localhost
database: testtb
username: app_user
password: ENV['APP_USER_POSTGRES_PASSWORD'] <= Troublesome line
当我通过bundle exec rails console
打开rails 控制台并输入ENV['APP_USER_POSTGRES_PASSWORD']
时,我会取回我在本地配置文件中指定的数据库密码。但是,当我启动我的 rails 服务器时,它无法连接到数据库,失败并显示
PGError FATAL: password authentication failed for user "app_user"
当我实际上以纯文本形式输入数据库密码而不是尝试通过ENV['...']
访问它时,这以前是有效的,但出于显而易见的原因,我希望将实际密码完全保留在此文件之外(因此代码存储库之外),同时仍然能够向database.yml
文件提交其他非安全更改。
我缺少的语法有什么特别之处,或者在加载database.yml
文件时环境变量由于某种原因不可用?
【问题讨论】:
您可能想查看有关配置和局部变量的指南:railsapps.github.io/rails-environment-variables.html tl;dnr: figaro gem 对此很有用。 @Antzi 请注意,根据 Figaro 的自述文件,Figaro 不支持 database.yml,因为它是在 figaro 配置之前读取的。 更新:Figaro 现在适用于所有 Rails 版本的 database.yml。 github.com/laserlemon/figaro/pull/100 【参考方案1】:更新:有些人在 cmets 中报告说这个 doesn't work 从 Rails 4.2.x.x 开始。我自己没试过,所以YMMV。
啊,终于找到了简单的解决方案——它接受嵌入式 Ruby:
password: <%= ENV['APP_USER_POSTGRES_PASSWORD'] %>
【讨论】:
天哪,你不知道我花了多长时间检查和仔细检查我的密码。谢谢!我想我应该记住 YAML 不是标记语言,但 erb 是。 @MikeH-R - 这正是我最终弄清楚这一点时的感受。 此解决方案在 Rails 4.2.5.1 的控制台中不起作用。它尝试发送整个字符串。 这是区分大小写的。 这不起作用,我尝试了大写和小写。几次。我不知道这里出了什么问题,我必须将其硬编码为 xxx.yml。【参考方案2】:如果您运行的是 Rails 版本 > 4.2 的快速解决方案,请运行以下命令:
spring stop
..然后运行 rails console
或其他 rails 命令。我的问题是需要重新启动 Spring 服务器才能刷新/获取我的新 ENV 变量。我正在启动 Rails 控制台,但在我关闭 Spring 之前它看不到它们。
以前的 Rails 版本没有这个问题,因为它们没有使用 Spring 服务器。
另一个帮助您排除故障的工具——使用以下命令打印出您的 database.yml 配置。你可以从命令行运行它,但我更喜欢在 Rails 控制台中运行它,因为你可以使用 awesome_print 让它变得漂亮:
rails console
内:
puts ActiveRecord::Base.configurations
...或使用 awesome_print
ap ActiveRecord::Base.configurations
或者从命令行代替:
bin/rails runner 'puts ActiveRecord::Base.configurations'
【讨论】:
我不知道为什么有人会否决这个答案。这是完全有效的(也对我有用)+1 谢谢@Kroltan,人们有时会否决一个实际上帮助他人的有价值的问题,然后却不提供任何理由,这很烦人。我猜仇恨者会讨厌。但我很高兴这对您有所帮助。 我在使用 rails 控制台和 rails runner 时都遇到了问题,这完全是因为这个 spring 重置对于获取新的 env 变量是必要的!谢谢;) 所以每次部署一个版本时,是否需要停止这个春天来获取新的变量?以上是关于无法访问“database.yml”文件中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在database.yml文件中设置rails环境变量?
如何使用 database.yml 为每个环境定义 json 文件
无法加载数据库配置。没有这样的文件 - database.yml - OpsWorks
Docker + Rails + MySQL =忽略database.yml中的环境变量