Reactjs 是否可以将React应用程序配置为使用容器';Kubernetes中的环境变量?

Reactjs 是否可以将React应用程序配置为使用容器';Kubernetes中的环境变量?,reactjs,docker,kubernetes,containers,Reactjs,Docker,Kubernetes,Containers,首先,让我们假设我们有一个React应用程序。我们希望构建它并将其部署到3个环境—开发、测试和生产环境。每个前端应用程序都需要调用一些API。API地址因环境而异。因此,它们应该存储为环境变量 作为每一个现代的、进步的开发人员,我们希望使用容器。尤其是库伯内特斯 我们希望构建web应用程序并将其部署在K8S集群上。应该构建容器映像并对其进行某种密封以进行更改,然后在部署到每个特定环境之前,应该注入变量 但这里似乎有一个很大的不可能。例如,当我们编译.NET应用程序时,它会在运行时读取一个配置文件

首先,让我们假设我们有一个React应用程序。我们希望构建它并将其部署到3个环境—开发、测试和生产环境。每个前端应用程序都需要调用一些API。API地址因环境而异。因此,它们应该存储为环境变量

作为每一个现代的、进步的开发人员,我们希望使用容器。尤其是库伯内特斯

我们希望构建web应用程序并将其部署在K8S集群上。应该构建容器映像并对其进行某种密封以进行更改,然后在部署到每个特定环境之前,应该注入变量

但这里似乎有一个很大的不可能。例如,当我们编译.NET应用程序时,它会在运行时读取一个配置文件。这不是React的案例。生成构建之后,我们只有静态文件。在构建React应用程序的过程中,变量被更改为静态值。在这一点之后似乎没有办法更新它——或者是吗?

您可以使用它来存储API端点地址,并将其作为pod中的环境变量引用


如果您想在pod运行时更改某些值,您可以挂载配置映射,对其所做的任何更改都将是

您试图解决问题的方式是不正确的

你不需要知道react应用程序中后端服务的地址。只有为react应用程序提供服务的前端服务器/网关需要了解后端服务。来自react应用程序的任何请求都应通过网关代理


请参阅API网关模式-

您可以在pod中读取这些变量,但不能基于这些变量更新React构建(不生成新构建)。这可能是某种解决方案。所以你的意思是我们应该调用API网关,而不是单独的API。但我们如何知道应该调用哪个环境API GW呢?从react的角度来看,它不需要知道它在什么环境中。React应用程序始终向同一服务器发出请求-
axios.get(“/api/v1”)
。是用户通过键入相应服务器的URL连接到他想要的环境。对不起,我不明白。如果我想在生产环境中连接到我的应用程序,我将连接到
http://prod:8080
。如果我想连接到我的QA环境,我将连接到
http://qa:8080
。在这两种情况下,我的浏览器中加载的应用程序都来自这些服务。当react应用程序使用代码
axios.get(“/api/v1”)
发出get请求时,它会转到
http://prod:8080/api/v1
在第一种情况下和
http://qa:8080/api/v1
在第二种情况下<代码>http://prod:8080/服务器或
http://qa:8080/
网关服务器负责对相应的后端服务进行后端API调用并转发请求。后端URL可以是任何内容。它们可以在网关服务器上轻松配置。如果您的api服务器位于URL
my qa api:9000
,则当请求
http://qa:8080/api/v1
由客户端(您的react应用程序)创建,
qa:8080
网关将其转发到
http://my-qa-api:9000/api/v1
,然后将响应发送回客户端。URl
my qa api:9000
是网关
qa:8080
的配置,例如,可以将其设置为环境变量。您希望利用K8“配置映射”和“机密”。您可以将它们作为环境变量或“虚拟文本文件”注入。对于机密,我更喜欢“虚拟文本文件”而不是环境变量,这样“记录器”就不会记录机密(当转储所有环境变量时)。因此,您可以编写一些基本代码来读取这些值(configmap或secrets),这些值在pod出现时被“装载”…请参阅本文了解我关于“secret”作为环境变量的观点:请看以下内容: