如何在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服务启动时读取,不会被硬编码到构建产物:
- 修改
next.config.js配置:
module.exports = { // 原有其他配置保留 publicRuntimeConfig: { // 暴露给前端浏览器侧的运行时变量 BASE_URL: process.env.BASE_URL || 'http://xx.xx.xx.xx:8000', }, // 仅服务端可用的变量可放在serverRuntimeConfig中,不会暴露给前端 serverRuntimeConfig: {} }
- 业务代码中通过官方API读取变量,不要直接用
process.env.BASE_URL:
import getConfig from 'next/config'; const { publicRuntimeConfig } = getConfig(); const BASE_URL = publicRuntimeConfig.BASE_URL;
- 修改Dockerfile,删除构建阶段的
ENV BASE_URL=xxx配置,保留原有构建逻辑即可。 - Docker Compose中直接传递环境变量即可生效:
version: '3' services: next-app: image: 你构建好的通用镜像名称 environment: - BASE_URL=http://自定义的接口地址:端口 ports: - "3000:3000"
方案2:启动时字符串替换(适配所有场景,包括纯SSG静态项目)
如果你的项目是纯静态导出的SSG项目,没有Node运行时,可以在容器启动时批量替换产物中的占位符实现动态修改:
- 把业务代码中所有用到BASE_URL的位置替换为唯一占位符,比如
__CUSTOM_BASE_URL__ - 修改Dockerfile的启动命令,增加替换逻辑:
# 原有构建逻辑全部保留,仅修改最后启动指令 CMD ["sh", "-c", "find /usr/app/.next -type f -name \"*.js\" -exec sed -i 's/__CUSTOM_BASE_URL__/'\"$BASE_URL\"'/g' {} \; && yarn start"]
- Docker Compose配置和方案1完全一致,直接传递
BASE_URL环境变量即可。
注意事项
- 如果使用Next.js 13+ App Router模式,服务端组件可直接读取
process.env变量,运行时会自动取容器环境变量;客户端组件如果需要运行时变量,推荐用方案2的占位符替换方式实现。
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

