【问题标题】:How to use node package dotenv to access local development environment variables in Red Hat OpenShift application?如何使用节点包 dotenv 访问 Red Hat OpenShift 应用程序中的本地开发环境变量?
【发布时间】:2022-01-03 09:57:51
【问题描述】:

我正在重新审视一个有一段时间没有更新的项目。

production/online 环境中,它使用定义在以下位置的环境变量:

openshift online console > applications > deployments > my node app > environment

development/offline 环境中,它使用在以下位置定义的环境变量:

./src/js/my_modules/local_settings(此文件被.gitignore忽略)

代码看起来像:

// check which environment we are in 
if (process.env.MONGODB_USER) {
    var online_status = "online";
}
else {
    var online_status = "offline";
}

// if online, use environment variables defined in red hat openshift  
if (online_status === 'online') {
    var site_title = process.env.SITE_TITLE;
    var site_description = process.env.SITE_DESCRIPTION;
    //etc 
}  

// if offline, get settings from a local file
else if (online_status === 'offline') {
    var local_settings = require('./src/js/my_modules/local_settings');
    var site_title = local_settings.SITE_TITLE;
    var site_description = local_settings.SITE_DESCRIPTION;
    // etc
}  

我想通过以下方式在我的本地项目仓库中安装dotenv package

npm install dotenv  

这样我可以:

  • 将我的本地设置放在项目根目录下的 .env 文件中(在 .gitignore 中忽略)
  • 能够使用process.env.SOME_VARIABLE 而不是local_settings.SOME_VARIABLE
  • 去掉一些 if/else 块,因为这两种情况都会指向 process.env.SOME_VARIABLE

我对这会如何影响在线环境感到有些困惑。

看到production/onlinedevelopment/offline 环境都将使用:

var some_variable = process.env.SOME_VARIABLE_HERE  

应用程序是否会自动知道:

  • 开发时查看本地.env文件?
  • 在生产中查看 Red Hat 环境变量?

并且会在 server-side 文件的开头添加所需的实例化:

require('dotenv').config()  

不知何故让 Red Hat OpenShift 吓坏了(因为它似乎已经有了自己的“东西”来解决对 OpenShift 控制台中定义的相关值的 process.env.SOME_VARIABLE_HERE 的引用)?

【问题讨论】:

  • 你能在 openshift 中创建更多的环境,还是只有 dev 和 prod 可用?
  • 对不起,我不明白问题背后的含义,我在本地环境中离线开发,然后推送到更新在线/生产应用程序的 github repo。我不确定在这种情况下“创建更多环境”意味着什么,它将如何解决问题,以及如果可能的话,我将如何做。对任何误解深表歉意。
  • 好的。一些企业需要一个称为测试或登台的中间环境。在这种环境中,另一个团队验证并验证开发人员所做的工作没有错误并符合所需的功能。这个团队被称为:质量保证、测试人员或质量保证

标签: node.js express environment-variables openshift-online


【解决方案1】:

通过任何环境(.dev .staging .prod)将文件放入源代码存储库或手动在服务器中(在.gitignore中)工作了很长时间,但现在它违背了devops。

干净的方法是使用环境变量,但远程管理并在应用程序启动时获取。

它是如何工作的?

基本上,您的应用不再读取或需要包含变量的文件(.env .properties 等)。它从远程 http 服务加载它们。

不打扰

在这种方法中,您不需要特定的语言变量(在您的情况下为 nodejs)。您只需要准备您的应用程序以使用环境变量。您的应用程序不关心变量来自哪里,只需要在操作系统级别可用。

为此,您只需使用简单的shell code 或您喜欢的语言的非常基本的算法(http 调用)下载变量。

之后,在您的应用启动后,变量就可以在最基本的级别上使用了。

var site_title = process.env.SITE_TITLE;

这种方法非侵入性,因为您的应用不需要某些编程语言中的库或算法等复杂的东西。只需要环境变量。

侵入性

与之前的替代方法相同,但要直接从环境系统中读取变量,您应该使用或创建您的语言中的类/模块。这为您提供了所需的变量:

var site_title = VariablesManager.getProperty("SITE_TITLE");

VariablesManager 必须在启动时使用来自远程服务 (http) 的变量并将它们存储以通过 getProperty 方法将它们提供给需要它的任何人。 p>

此外,这个 VariablesManager 通常有一个名为 hot-reload 的功能,它会定期更新使用远程变量管理器的变量。有了这个,如果您的应用程序正在与真实用户一起在生产环境中运行并且需要更新一些变量,您只需要在变量管理器中更改它。您的应用会自动加载新值,无需重新启动或触摸您的应用

这种方法侵入性,因为您需要以某种编程语言加载高级库或创建它。

开发人员

您的应用程序只需要一些与使用远程变量相关的属性或设置。例如:acme-web-staging的变量:

remote_variables_manager = https://variables.com/api
application_id = acme-web-staging
secure_key = *****

您可以隐藏安全密钥并使用环境变量(在平台控制台中创建)参数化 application_id

remote_variables_manager = https://variables.com/api
application_id = ${application_id}
secure_key = ${remote_variables_manager_key}

或者,如果您希望每个环境都有一个变量管理器

分期

remote_variables_manager = https://variables-staging.com/api
application_id = acme-web
secure_key = *****

生产

remote_variables_manager = https://variables-staging.com/api
application_id = acme-web
secure_key = *****

变量管理器

这个概念是多年前引入的。我用的是java。它包含在具有以下功能的 Web 应用程序中:

  • 安全登录
  • 创建应用程序
  • 创建应用程序的变量
  • 密码敏感值
  • 发布 http 端点以按应用程序下载或查询变量

这里列出了一些现成的替代品:

根据您的具体情况

  • 不要使用 dot-env
  • 使用纯 process.env.foo
  • 在您的 openshift 基础架构中部署远程变量管理器
  • 在您的 openshift Web 控制台中只创建一个变量:APP_ENVIRONMENT
  • 在您的代码开头,执行如下操作:
if (process.env.APP_ENVIRONMENT === "PROD")
  //get variables from remote service using 
  //some http client like axios, request, etc
  //then inject them to your process.env
  process.env.site_url = remoteVariables.site_url
else
  //we are in local developer workspace
  //so, nothing complex is required
  //developer should inject manually 
  //before the startup: npm run start or dev
  //export site_url = "acme.com" 

如果您可以在 openshift 应用程序启动之前配置 shell 脚本的执行,您可以在该阶段加载和公开变量,并且不需要之前的 sn-p,因为变量将准备好被检索直接在您的应用中使用 process.env

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2019-10-25
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多