sinatra 应用程序找不到环境变量,但测试脚本可以
sinatra app can't find environmental variable but test script can
我使用环境变量的存在来确定我的应用程序是否已部署(与在我的本地计算机上运行相反)。
我的测试脚本可以找到并显示变量值,但根据我的应用程序,变量不存在。
test.rb
Secret_Key_Path = ENV['APPLICATION_VERSION'] ? '/path/to/encrypted_data_bag_secret' : File.expand_path('~/different/path/to/encrypted_data_bag_secret')
puts ENV['APPLICATION_VERSION']
puts Secret_Key_Path
puts File.exists? Secret_Key_Path
info.rb(相关位)
::Secret_Key_Path = ENV['APPLICATION_VERSION'] ? '/path/to/encrypted_data_bag_secret' : File.expand_path('~/different/path/to/encrypted_data_bag_secret')
如果我记录 Secret_Key_Path
的值,它会记录为我不期望的值(即 '~/different/path/to/encrypted_data_bag_secret'
而不是 '/path/to/encrypted_data_bag_secret'
)
这是我启动我的应用程序的方式(从我的主要可执行脚本内部,所以我可以从任何地方运行 app install
而不必转到文件夹)
exec "(cd /path/to/app/root && exec sudo rackup --port #{80} --host #{'0.0.0.0'} --pid /var/run/#{NAME}.pid -O NAME[#{NAME}] -D)"
如果我这样做 env | grep APP
我得到:
APPLICATION_VERSION=1.0.130
APPLICATION_NAME=app-name
有人建议这是执行上下文问题,但我不确定如果是那样的话该如何解决。
所以这是怎么回事?任何帮助和建议将不胜感激。
您可以使用 -E
开关将您的环境变量保留在 sudo 中:
来自手册:
-E, --preserve-env
向安全策略表明用户希望保留其现有环境变量。安全策略可能
return 如果用户没有保护环境的权限,则会出错。
示例:
$ export APPLICATION_VERSION=1.0.130
$ export APPLICATION_NAME=app-name
检查变量:
$ sudo -E env | grep APP
你应该得到输出:
APPLICATION_NAME=app-name
APPLICATION_VERSION=1.0.130
此外,如果您想永久保留变量,您可以添加到 /etc/sudoers
文件:
Defaults env_keep += "APPLICATION_NAME APPLICATION_VERSION"
我使用环境变量的存在来确定我的应用程序是否已部署(与在我的本地计算机上运行相反)。
我的测试脚本可以找到并显示变量值,但根据我的应用程序,变量不存在。
test.rb
Secret_Key_Path = ENV['APPLICATION_VERSION'] ? '/path/to/encrypted_data_bag_secret' : File.expand_path('~/different/path/to/encrypted_data_bag_secret')
puts ENV['APPLICATION_VERSION']
puts Secret_Key_Path
puts File.exists? Secret_Key_Path
info.rb(相关位)
::Secret_Key_Path = ENV['APPLICATION_VERSION'] ? '/path/to/encrypted_data_bag_secret' : File.expand_path('~/different/path/to/encrypted_data_bag_secret')
如果我记录 Secret_Key_Path
的值,它会记录为我不期望的值(即 '~/different/path/to/encrypted_data_bag_secret'
而不是 '/path/to/encrypted_data_bag_secret'
)
这是我启动我的应用程序的方式(从我的主要可执行脚本内部,所以我可以从任何地方运行 app install
而不必转到文件夹)
exec "(cd /path/to/app/root && exec sudo rackup --port #{80} --host #{'0.0.0.0'} --pid /var/run/#{NAME}.pid -O NAME[#{NAME}] -D)"
如果我这样做 env | grep APP
我得到:
APPLICATION_VERSION=1.0.130
APPLICATION_NAME=app-name
有人建议这是执行上下文问题,但我不确定如果是那样的话该如何解决。
所以这是怎么回事?任何帮助和建议将不胜感激。
您可以使用 -E
开关将您的环境变量保留在 sudo 中:
来自手册:
-E, --preserve-env 向安全策略表明用户希望保留其现有环境变量。安全策略可能 return 如果用户没有保护环境的权限,则会出错。
示例:
$ export APPLICATION_VERSION=1.0.130
$ export APPLICATION_NAME=app-name
检查变量:
$ sudo -E env | grep APP
你应该得到输出:
APPLICATION_NAME=app-name
APPLICATION_VERSION=1.0.130
此外,如果您想永久保留变量,您可以添加到 /etc/sudoers
文件:
Defaults env_keep += "APPLICATION_NAME APPLICATION_VERSION"