我配置了自动构建Angular 6应用程序,并在每次将其推送到我的代码存储库(Google Cloud存储库)时在Kubernetes中进行部署。
Dev环境变量通常按如下方式存储在environment.ts文件中:
export const environment = {
production: false,
api_key: "my_dev_api_key"
};
但是我不想将Prod机密存储在存储库中,因此我认为我可以使用Kubernetes机密。
因此,我在Kubernetes中创建了一个秘密:
kubectl create secret generic literal-token --from-literal api_key=my_prod_api_key
但是如何在我的Angular应用中使用它?
答案 0 :(得分:3)
尽管如此,您的Angular应用程序还是 client 应用程序,即用户的浏览器会下载该应用程序的源代码(一堆CSS / JS / HTML文件,图像等),并且在用户计算机上执行它。因此,您无法像实现 client / server 应用程序那样隐藏任何东西。在客户端/服务器应用程序中,所有秘密都将驻留在服务器部分中。如果将机密放入k8s机密中,则不会将其提交到存储库中,但是无论如何您都将其公开给所有用户。
如果您仍然想基于环境变量填充配置(这是合法的用例),那么我已经看到并使用了以下方法。该应用程序为Angular 6,并由nginx
服务器提供给浏览器。 docker容器中的启动脚本有点奇怪,看起来类似于以下几行:
envsubst < /usr/share/nginx/html/assets/config.json.tpl > /usr/share/nginx/html/assets/config.json
rm /usr/share/nginx/html/assets/config.json.tpl
echo "Configuration:"
cat /usr/share/nginx/html/assets/config.json
nginx -g 'daemon off;'
如您所见,我们已经使用envsubst
替换了Assets文件夹中的配置模板。 config.json.tpl
可能看起来像这样:
{
"apiUrl": "${API_URL}"
}
envsubst
将用其真实值替换环境变量,并且资产中将具有有效的JSON配置代码段。然后nginx
将启动。