在rails app中加载环境变量而无需重新启动服务器

时间:2016-05-18 20:22:03

标签: ruby-on-rails amazon-ec2

在远程EC2实例上编辑/etc/environment文件后,如何让我的rails应用程序知道新的环境变量?

我经常在我的secrets.yml中添加新的(次要)内容,但我不想为它重新启动服务器,也不想使用现有的秘密。

2 个答案:

答案 0 :(得分:2)

在linux中,每个进程都从其父进程继承envvars,并且值是按值传递的,而不是通过引用传递的。而且,它们不像闭包那样表现。因此,子进程(你的rails / ruby​​ app进程)将不会获得其父进程的任何新环境变量(你启动rails / ruby​​应用程序的shell进程)。

这就是为什么不可能的原因。但是,您可以使用dotenvfigaro等宝石来查看环境变量中的某个文件,并在更改后重新加载它们。

答案 1 :(得分:0)

您应该可以在config/spring.rb添加一行:

Spring.watch "config/secrets.yml"

这将允许Spring检测您的secrets.yml文件中发生更改的时间。

但是,如果您实际上询问如何让您的应用知道您已经更改了文件中的环境变量,则无法实现。可以在文件中检测配置值,但是在shell环境中检测环境变量。您必须将它们加载到shell中才能使它们发挥作用,这需要停止服务器,将新更改提取到环境中,然后再次启动服务器。

了解文件中的配置值(.yml,.xml,.ini等)与shell脚本中的环境变量之间的区别很重要,因为它的应用方式和使用方式完全不同