nextjs env变量始终未定义

时间:2020-10-11 21:25:44

标签: docker environment-variables next.js next

我的项目设置如下:

project-ci (only docker)
  nextjs
  backend

暂存和生产相同,因此我传入了仅暂存此参数的docker-compose.yml文件(这两个环境都是先通过npm run build然后是npm run start的这些命令构建的)

args:
    NEXT_PUBLIC_URL: arbitrary_value

在nextjs的Dockerfile中放置了这些命令

ARG NEXT_PUBLIC_URL
ENV NEXT_PUBLIC_URL=$NEXT_PUBLIC_URL

因此,变量可以在process.env.NEXT_PUBLIC_URL下的nextjs中访问。 到目前为止,如果我尝试在console.log(process.env.NEXT_PUBLIC_URL)中使用index.js,则该值始终为undefined。任何想法错了,也检查了文档,但结果仍然是undefined

https://nextjs.org/docs/api-reference/next.config.js/runtime-configuration

https://nextjs.org/docs/api-reference/next.config.js/environment-variables

3 个答案:

答案 0 :(得分:3)

虽然 NextJs 有很多优点,但这是我发现的一个缺点。由于它们的特性,Advanced Static Optimization(https://nextjs.org/docs/advanced-features/automatic-static-optimization) 环境变量在构建时被转换为它们的值。这在他们的网站上没有得到很好的记录,但经过大量测试后,我找到了解决方案。

所以你必须告诉你的 docker 镜像,当它在 npm run build 之前启动到 npm run start 时,它将消耗当前在 docker 镜像中的环境变量,并使用你想要的值将它们优化到构建中.

干杯。

答案 1 :(得分:0)

我可以使用公共运行时配置属性访问环境变量:

next.config.js

module.exports = {
    publicRuntimeConfig: {
      NEXT_PUBLIC_URL: process.env.NEXT_PUBLIC_URL,
    }
};

然后:

import getConfig from "next/config";
const { publicRuntimeConfig } = getConfig();
console.log(publicRuntimeConfig.NEXT_PUBLIC_URL);

如果不起作用,请修复在docker容器中创建的env变量

答案 2 :(得分:-1)

我不需要做任何特别的事情,但我必须确保我的 env 变量以 NEXT_PUBLIC_...