在不重新启动应用程序的情况下设置 Heroku 环境变量

Posted

技术标签:

【中文标题】在不重新启动应用程序的情况下设置 Heroku 环境变量【英文标题】:Set Heroku environment variable without restarting app 【发布时间】:2016-04-16 18:29:25 【问题描述】:

是否可以在不重启应用的情况下设置 Heroku 环境变量

我的应用通过 OAuth2 连接到不同的在线服务。对于我连接的每个服务,我需要设置一个 OAuth2 ID 和密码。为了将这些配置变量保留在我的代码之外,我使用了环境变量,并在 process.env (node.js) 上读取它们。

每次向我的应用添加新服务时,我都需要为 ID 和 secret 添加相应的环境变量。我需要在推送最新代码之前执行此操作,这样当应用下次使用新服务连接启动时,OAuth2 ID 和机密变量都可用。

目前我的工作流程如下:

    使用 Heroku 工具带设置环境变量:heroku config:set <SERVICE>_ID=foo <SERVICE>_SECRET=bar 推送最新代码:git push heroku master

目前,这两个操作都会重启应用。我真的希望第一次操作不要重新启动应用程序,因为对这些配置变量的更改不需要在步骤 2 之前生效)。通过在步骤 1) 重新启动,我的应用将经历不必要的停机时间。

那么,有什么办法可以防止第 1 步)重启应用?

【问题讨论】:

您不能更改正在运行的进程的环境变量。您只能从应用程序内操作它。但是,如果您需要在应用程序已经运行时更改环境变量,那么您无论如何都做错了。 感谢您的评论,但如果您注意到,我实际上是在添加一个环境变量,而不是更改现有的。所以我不认为这算作“做错事”? 您在应用程序运行后设置服务机密。对我来说,服务机密是应用程序运行时不应该更改的配置。 好的,很公平。然而,这是尚未部署的服务的服务机密。所以它不应该影响其他任何东西。我真正想要的是部署一项新服务并将该服务的环境变量设置为原子操作,即仅导致单个应用重启的操作。 【参考方案1】:

根据this article,它非常明确地指出

每当您设置或删除配置变量时,您的应用都会重新启动。

就我个人而言,我也希望有一种方法可以满足您的要求。在较大的应用程序上,当您运行许多进程类型时,系统范围的硬重启可能会很痛苦。很多时候,我设置的环境变量对于应用程序来说并不重要,可以立即获取,例如涉及未来功能的环境变量,或者可以使用旧值但您希望新值在滚动重启中生效的设置时尚。

【讨论】:

这是向heroku提议的吗?【参考方案2】:

目前,无法避免应用重启。但是您可以使用命令heroku config:edit 一次编辑您的环境,甚至粘贴一个新的环境集,避免多次重新启动。

根据heroku配置帮助:

(...)

COMMANDS
  config:edit   interactively edit config vars
  config:get    display a single config value for an app
  config:set    set one or more config vars
  config:unset  unset one or more config vars

这样你就可以运行了

heroku config:edit

此外,您可能想看看这个问题(提案): https://github.com/heroku/cli/issues/1570

【讨论】:

以上是关于在不重新启动应用程序的情况下设置 Heroku 环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新加载页面的情况下重新启动 Angular 应用程序?

PHP-如何在不重新启动 rds 的情况下将 aws.push git 到弹性 beantalk?

如何在不重新启动活动的情况下切换主题(夜间模式)?

是否可以在不重新启动 JSF 中的服务器的情况下更新应用程序?

激活 WDAC 规则 16 不允许在不重新启动的情况下应用策略

是否可以在不重新启动服务器的情况下在远程 weblogic 上重新部署应用程序?