Runtime dynamic env variables, that need to be exposed to client
Answered
Knopper gall posted this in #help-forum
Knopper gallOP
I have a situation, where I'm building a nextjs frontend into a docker container, which needs to run on k8s, so the environment variables need to be overridable.
In this specific case, I have an API_URL env variable, which the browser also needs to know; which needs to be overridable.
I tried doing the following
But this is printing two different env variables, the server one is the one that i passed to
So how would i approach this?
In this specific case, I have an API_URL env variable, which the browser also needs to know; which needs to be overridable.
I tried doing the following
const apiUrl = process.env.API_URL
console.warn({apiUrl})
if (!apiUrl) throw new Error("env variable API_URL missing")
export default function RootLayout({ children }: PropsWithChildren) {
  return (
    <html lang="en">
      <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
        <App apiUrl={apiUrl!}>
          {children}
        </App>
      </body>
    </html>
  )
}"use client"
export type AppProps = PropsWithChildren & {
  apiUrl: string,
}
export default function App({ children, apiUrl }: AppProps) {
  const client = new ApolloClient({
    uri: apiUrl,
    cache: new InMemoryCache(),
    ssrMode: true,
  })
  console.warn("passed api url:", apiUrl)
  return (
    <ApolloProvider client={client}>
      {children}
    </ApolloProvider>
  )
}But this is printing two different env variables, the server one is the one that i passed to
docker run -e API_URL=http://test, and the client one is the one from my .env file (i cannot seem to build the project unless i add an .env file, it seems to run the code and gives errors when generating /_not_found)So how would i approach this?
Answered by Asian black bear
Check this out: https://github.com/expatfile/next-runtime-env
2 Replies
Asian black bear
Check this out: https://github.com/expatfile/next-runtime-env
Answer
Knopper gallOP
Great, that seems to do it