在 Nextjs 应用程序中使用 Cloud Run 环境变量

Mik*_*e B 6 environment-variables reactjs next.js google-cloud-run

我最近构建了一个 Nextjs 应用程序,并将其托管在 Google Cloud Run 上。

我的应用程序通过该方法向外部 API 发出一些请求getStaticProps()

我希望能够根据环境(例如 prod 或 dev)使用针对每个环境设置不同的环境变量来指向不同的 API 主机。

我知道我可以将这些变量存储在特定于环境的文件中,例如,.env.development但是.env.production我希望能够将这些环境变量存储在云运行服务的 Google Cloud 控制台的环境变量字段中,并跳过将它们完全存储在文件中。

我尝试将变量添加到 Cloud Run,但不起作用。我还尝试在变量前加上 NEXT_PUBLIC_... 没有运气。

有人对如何实现这一目标有任何建议吗?

Mik*_*e B 4

好吧...我想我现在已经明白了。我使用 Cloud Builds 来构建我的容器,并且容器npm run build在运行之前运行npm run start

我假设我的 Cloud Run 变量在 Cloud Build 构建项目时不可用。

因此,我认为我的解决方案可能会尝试使用替换变量在构建时注入变量。

编辑:已确认。如果我在开发模式下启动 Nextjs,以便为每个请求在服务器上呈现页面,则使用 Cloud Run 环境变量。为了构建用于生产的 Nextjs 应用程序,我将环境变量包含在由 Cloud Build 构建的 Dockerfile 中

编辑:根据请求,设置环境变量的 dockerfile 示例:

FROM node:16.13-alpine
RUN mkdir -p /usr/src
WORKDIR /usr/src
COPY . /usr/src

ENV NEXT_PUBLIC_MY_API_HOST='https://some.host.com'

RUN npm install -only=production
RUN npm run build
EXPOSE 3000
CMD npm run start
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下命令从代码中引用环境变量process.env.NEXT_PUBLIC_MY_API_HOST

  • @SamiulHSohan,所以,*Cloud Run* 环境变量实际上可以从 nextjs 应用程序中获得,但是我的错误是忽略了这样一个事实:当我为 *Cloud Run* 构建容器时,我不在 * 的上下文中。 Cloud Run* 应用程序,因为容器实际上是由 *Cloud Build* 构建的。请记住,*getStaticProps()* 在构建时运行。为了解决该问题,您需要找到一种方法来向应用程序提供除 *Cloud Run* 环境变量之外的变量。 (2认同)