Typescript NextJS和环境变量-向客户端获取值

Typescript NextJS和环境变量-向客户端获取值,typescript,docker,environment-variables,next.js,Typescript,Docker,Environment Variables,Next.js,如果这个问题以前有人回答过,我很抱歉,但我在这里用一些简单的东西把头撞在墙上 我的项目正在server模式下运行。我们需要能够在运行时将环境变量传入,并使它们在服务器端和客户端都可用 我正在使用中描述的publicRuntimeConfig方法,并且我没有做任何异常的事情(要遵循的代码) 问题是,在开发模式(spirn dev)下运行时,一切正常,但当我构建项目并将其固定(或将其移动到kubernetes进行部署)时,它无法正常工作 代码如下: next.config.js const next

如果这个问题以前有人回答过,我很抱歉,但我在这里用一些简单的东西把头撞在墙上

我的项目正在
server
模式下运行。我们需要能够在运行时将环境变量传入,并使它们在服务器端和客户端都可用

我正在使用中描述的
publicRuntimeConfig
方法,并且我没有做任何异常的事情(要遵循的代码)

问题是,在开发模式(
spirn dev
)下运行时,一切正常,但当我构建项目并将其固定(或将其移动到kubernetes进行部署)时,它无法正常工作

代码如下:
next.config.js

const nextConfig={
publicRuntimeConfig:{
PARAM_A:process.env.PARAM_A | | |“defaultA”,
PARAM_B:process.env.PARAM_B | | |“defaultB”
}
};
module.exports=nextConfig;
\u app.tsx

从“React”导入React;
从“下一个/App”导入App,{AppContext};
从“下一个/Head”导入Head;
从“./src/components/Menu”导入{Menu};
类CustomApp扩展应用程序{
静态异步getInitialProps({Component,ctx}:AppContext){
让pageProps={};
if(Component.getInitialProps){
pageProps=等待组件.getInitialProps(ctx);
log(“[[u app.tsx]pageProps”,pageProps);
}
返回{pageProps};
}
render(){
const{Component,pageProps}=this.props;
返回(
试验区
);
}
}
导出默认CustomApp;
index.tsx
otherpage.tsx
help.tsx
除了它们的措辞之外是相同的,所以我只记下
index.tsx
以节省空间:

import React,{Component}来自“React”;
从“next/config”导入getConfig;
从“下一步”导入{NextPageContext};
类索引扩展组件{
静态异步getInitialProps(ctx:NextPageContext){
const nextConfig=getConfig();
const clientConfig=(nextConfig&&nextConfig.publicRuntimeConfig)|{};
const settings=Object.keys(process.env).length>1?process.env:clientConfig;
日志(“[索引页]-nextConfig”,nextConfig);
log(“[INDEX PAGE]-clientConfig”,nextConfig.publicRuntimeConfig);
console.log(“[索引页]-设置”,设置);
log(“[索引页]-process.env”,process.env);
返回{settings};
}
render(){
返回索引页;
}
}
出口违约指数;
当我运行
warn dev
时,浏览器dev tools中该行的输出
console.log(“[索引页]-nextConfig”,nextConfig)
如预期(注意
参数A
参数B
):

当我对项目进行dockerize并提供env变量时,所有页面的输出如下所示,对于
publicRuntimeConfig
,没有任何内容从服务器端传递到客户端:

[INDEX PAGE] - nextConfig 
{serverRuntimeConfig: {…}, publicRuntimeConfig: {…}}
serverRuntimeConfig: {}
publicRuntimeConfig: {}
__proto__: Object
第一个页面获取值(因为getInitialProps是在_app.tsx中执行的),但每当我导航到任何其他页面(使用next/link)时,我都会丢失变量。
我需要这些值在我的应用程序的所有页面中可用。请告诉我,我遗漏了一些明显的信息。

当您构建应用程序时,
publicRuntimeConfig
将被捆绑

当您构建Docker映像时,会生成应用程序。但是,您的环境变量此时不可用

启动容器时,您提供了环境变量,以便服务器端代码可以使用它们,但客户端代码不能


一种解决方案是在容器启动时构建应用程序,因为构建程序可以访问您提供的环境变量。不过,我并不真正推荐这种方法

另一种解决方案是使用Docker构建参数在构建时设置环境变量:

Dockerfile

然后将环境变量作为构建参数传递:

docker build --build-arg PARAM_A=something --build-arg PARAM_B=something ...
这允许您为每个环境传递不同的生成参数

但是,这确实意味着您的每个环境都有一个单独的映像


我希望这有帮助。

您如何将环境变量传递到您的容器?你能发布你的Dockerfile吗?现在使用一个简单的
env.list
文件和命令
docker run-p 3001:3000--env file./env.list-t prj changed:latest
以及如何在构建映像时传递环境变量?我不传递它们。我想在“运行时”执行此操作,只是因为我需要能够为不同的环境启动相同的映像,例如开发、登台、测试版、生产当您构建应用程序时,
publicRuntimeConfig
将被捆绑,因此客户端代码将不再能够访问您的环境变量。
ARG PARAM_A
ARG PARAM_B

ENV PARAM_A=$PARAM_A
ENV PARAM_B=$PARAM_B

# ...
docker build --build-arg PARAM_A=something --build-arg PARAM_B=something ...