NextJS process.env.NEXT_PUBLIC 变量在生产中为空

Jan*_*Jan 6 gitlab-ci kubernetes dockerfile next.js

我有一个 NextJS“^11.1.2”应用程序,它在 Dockerfile 中构建并通过 CI/CD 部署到生产环境。但我的process.env变量没有渲染

我的客户端代码中有这个,应该在运行时呈现:

const PublicApiUrl = process.env.NEXT_PUBLIC_API_URL;

在我的(Gitlab)CI/CD Pipeline中,我还通过 AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS 添加了一些--build-args, 以及:ENVARG

AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS --build-arg=NEXT_PUBLIC_API_URL=https://my.api.com --build-arg=NEXT_PUBLIC_API_URL=https://my.api.com --build-arg=NEXT_PUBLIC_BUILDER_KEY=XXXXXX
NEXT_PUBLIC_API_URL=https://my.api.com
API_URL=https://my.api.com
Run Code Online (Sandbox Code Playgroud)

Dockerfile

ARG API_URL
ENV API_URL=$API_URL
ARG NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ARG NEXT_PUBLIC_BUILDER_KEY
ENV NEXT_PUBLIC_BUILDER_KEY=$NEXT_PUBLIC_BUILDER_KEY
RUN npm run build # which resolves in "build": "next build"
Run Code Online (Sandbox Code Playgroud)

下面的值肯定是被拾取的(我做了一个RUN env,可以看到变量在那里)。

这是我configMap在 Kubernetes 中将文件安装.env.local到容器中的情况:

ARG API_URL
ENV API_URL=$API_URL
ARG NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ARG NEXT_PUBLIC_BUILDER_KEY
ENV NEXT_PUBLIC_BUILDER_KEY=$NEXT_PUBLIC_BUILDER_KEY
RUN npm run build # which resolves in "build": "next build"
Run Code Online (Sandbox Code Playgroud)

这是我的部署,它将安装configMap到容器中.env.local

apiVersion: v1
kind: ConfigMap
metadata:
  name: frontend-env-local
  annotations:
    "helm.sh/resource-policy": keep
data:
  .env: |-
    NEXT_PUBLIC_API_URL=https://my.api.url
    API_URL=https://my.api.url
Run Code Online (Sandbox Code Playgroud)

当我在本地构建它时next build,它可以工作并且我的变量被渲染。

但是当我推送、构建和部署它并运行应用程序时,它是一个空字符串:

const PublicApiUrl = "";
Run Code Online (Sandbox Code Playgroud)

为什么 NextJS 无法识别该变量?

我登录到生产(Kubernetes pod)终端并运行env。变量也存在。

有什么想法为什么会发生这种情况吗?

Jan*_*Jan 10

我也必须像这样定义变量next.config.js

module.exports = {
    serverRuntimeConfig: {
        API_URL: process.env.API_URL,
    },
    // Will be available on both server and client
    publicRuntimeConfig: {
        NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
    }
}
Run Code Online (Sandbox Code Playgroud)

进行此更改后,似乎既不configMap需要 也不需要安装的卷...只有--build-arg我的 CI/CD 中的和ARG以及ENVDockerfile