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

如何在docker compose运行时传递BASE_URL到next.config.js实现镜像通用

结论

默认无法直接在Docker Compose运行阶段生效,因为你当前用的 next.config.js 下的 env 配置属于构建时变量,Next.js 执行 yarn build 时会把对应值直接硬编码到打包后的JS产物中,后续容器运行阶段修改环境变量不会更新已经固化的产物内容。

可行实现方案

根据你的项目渲染模式选对应方案即可:

方案1:使用Next.js运行时配置(适配SSR/ISR项目)

该方案依赖Next.js内置的运行时配置能力,变量会在Node服务启动时读取,不会被硬编码到构建产物:

  1. 修改next.config.js配置:
module.exports = {
  // 原有其他配置保留
  publicRuntimeConfig: {
    // 暴露给前端浏览器侧的运行时变量
    BASE_URL: process.env.BASE_URL || 'http://xx.xx.xx.xx:8000',
  },
  // 仅服务端可用的变量可放在serverRuntimeConfig中,不会暴露给前端
  serverRuntimeConfig: {}
}
  1. 业务代码中通过官方API读取变量,不要直接用process.env.BASE_URL:
import getConfig from 'next/config';
const { publicRuntimeConfig } = getConfig();
const BASE_URL = publicRuntimeConfig.BASE_URL;
  1. 修改Dockerfile,删除构建阶段的ENV BASE_URL=xxx配置,保留原有构建逻辑即可。
  2. Docker Compose中直接传递环境变量即可生效:
version: '3'
services:
  next-app:
    image: 你构建好的通用镜像名称
    environment:
      - BASE_URL=http://自定义的接口地址:端口
    ports:
      - "3000:3000"

方案2:启动时字符串替换(适配所有场景,包括纯SSG静态项目)

如果你的项目是纯静态导出的SSG项目,没有Node运行时,可以在容器启动时批量替换产物中的占位符实现动态修改:

  1. 把业务代码中所有用到BASE_URL的位置替换为唯一占位符,比如__CUSTOM_BASE_URL__
  2. 修改Dockerfile的启动命令,增加替换逻辑:
# 原有构建逻辑全部保留,仅修改最后启动指令
CMD ["sh", "-c", "find /usr/app/.next -type f -name \"*.js\" -exec sed -i 's/__CUSTOM_BASE_URL__/'\"$BASE_URL\"'/g' {} \; && yarn start"]
  1. Docker Compose配置和方案1完全一致,直接传递BASE_URL环境变量即可。
注意事项
  • 如果使用Next.js 13+ App Router模式,服务端组件可直接读取process.env变量,运行时会自动取容器环境变量;客户端组件如果需要运行时变量,推荐用方案2的占位符替换方式实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:54:03