You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为部署在Dokku上的Next.js应用配置可读取的环境变量?

解决Dokku部署Next.js应用无法读取环境变量的问题

排查与解决方案

1. 先确认应用已重启

执行命令手动重启应用,确保环境变量生效:

dokku ps:restart app_name

重启后重新测试API路由,查看是否能获取到变量。

2. 针对NEXT_PUBLIC_前缀变量的特殊处理

NEXT_PUBLIC_开头的变量会被Next.js在构建阶段静态注入客户端代码,如果你的Dockerfile包含npm run build步骤,需要确保构建阶段能读取到该变量:

方法A:使用Dokku构建环境插件

Dokku默认不会将config:set的变量传递给Dockerfile构建阶段,安装build-env插件解决:

sudo dokku plugin:install https://github.com/dokku/dokku-build-env.git build-env
dokku build-env:set app_name NEXT_PUBLIC_SERVER_URL=https://server_url.com

之后重新推送代码或触发构建。

方法B:修改Dockerfile添加构建参数

在Dockerfile中声明构建参数,确保构建和运行阶段都能访问变量:

# 构建阶段
FROM node:18-alpine AS builder
ARG NEXT_PUBLIC_SERVER_URL
ENV NEXT_PUBLIC_SERVER_URL=$NEXT_PUBLIC_SERVER_URL
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 运行阶段
FROM node:18-alpine AS runner
WORKDIR /app
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
EXPOSE 3000
CMD ["npm", "start"]

配置Dokku构建参数:

dokku docker-options:add app_name build "--build-arg NEXT_PUBLIC_SERVER_URL=https://server_url.com"

重新部署应用。

3. 仅服务器端使用时,移除NEXT_PUBLIC_前缀

如果该变量仅在API路由(服务器端)使用,无需客户端访问,直接改用普通环境变量:

dokku config:set app_name SERVER_URL=https://server_url.com

修改API路由代码:

export async function GET() {
  const baseUrl = process.env.SERVER_URL;
  return NextResponse.json({
    baseUrl,
  });
}

普通环境变量会由Dokku在容器运行时自动传递,服务器端代码可直接读取。

4. 验证容器内环境变量

进入容器确认变量是否存在:

dokku enter app_name web
echo $NEXT_PUBLIC_SERVER_URL

如果输出正确值,问题出在Next.js配置;如果为空,检查Dokku应用配置或Dockerfile的启动逻辑。

内容的提问来源于stack exchange,提问作者Becksholm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:15:09