【发布时间】:2019-07-17 23:29:22
【问题描述】:
我有一个 Angular 7 应用程序,其中 app.module.ts 文件如下所示。请注意,在此示例中,有 2 个模块,每个模块都有 1 个键,其值需要外部化。 externalized 的意思是应该在运行时从环境中获取值。
@NgModule({
declarations: [ ... ],
imports: [
SomeModule.forRoot({ apiKey1: "needs to be externalized" }),
AnotherModule.forRoot({ apiKey2: "needs to also be externalized" })
],
providers: [ ... ],
bootstrap: [AppComponent]
})
export class AppModule { }
我要做的是构建这个应用程序(例如ng build,然后使用 Docker 将其容器化)。在部署时,DevOps 人希望按如下方式运行 docker 容器。
docker run -e API_KEY_1='somekey' -e API_KEY_2='anotherkey' -p 80:80 my-container:production
请注意,API_KEY_1 应映射到 apiKey1,API_KEY_2 应映射到 apiKey2。
是否有任何规范的方法可以将 Angular 应用程序的值外部化?
我曾想过编写一个帮助脚本来对文件进行字符串替换,但我认为这种方法不是很规范(因为转译的 Angular 应用程序文件被混淆和缩小了)。该脚本将在容器启动时运行,读取环境变量(键和值),然后查看文件以将旧值替换为环境中的值。
最终,Angular 应用程序将与 Kubernetes 进行编排。我想知道是否有任何东西可以帮助或影响如何以最佳实践方式将价值观外化。
感谢任何帮助。
【问题讨论】:
-
容器启动时创建一个
credentials.json怎么样?您可以将每个键值对作为 json、assets/路径或其他地方。然后 Angular 应用程序可以通过 AJAX 调用(GET /assets/credentials.json)获取它。 -
哦,我的回答可能很危险,因为用户可以在 Chrome 检查器的网络选项卡中获取值。如果您可以加密 json 并在运行时对其进行解密,则应用程序可以安全地获取 api 密钥。
-
@kuroneko0441 问题是 Angular 模块显示了代码示例,其中键放置在
app.module.ts中。这些东西被推送到js文件,如果有人真的想要,他们可以重新格式化和研究js文件并抓取它们(或者如你所说,观察流量)。我认为您的担忧是有效的(加密/解密)且相关;但这篇文章是关于将这些值外部化,以便无论在何处部署应用程序,部署过程都可以通过环境变量注入它们。
标签: angular docker kubernetes properties-file