Jenkins+Docker传变量至Next.js,服务端日志无值求助
问题排查:Jenkins+Docker向Next.js传递环境变量失效
问题背景
在自建服务器上通过Jenkins和Docker部署Next.js项目时,已在Jenkins中创建值为“This is a test”的VAR_TEST密钥文本凭证,配置了Pipeline脚本、Dockerfile及Next.js配置:
- 容器内执行
echo $VAR_TEST能正常显示值 - Next.js服务端通过
console.log('Test : ', process.env.VAR_TEST)打印无值
核心错误点及修复方案
1. Dockerfile中ARG声明位置错误
问题原因:ARG指令放在FROM之前时,仅属于构建的"全局"阶段,进入FROM后的新构建阶段后,该ARG会失效,导致后续ENV VAR_TEST=$VAR_TEST无法获取到正确值。
修复后的Dockerfile:
# 使用Node.js基础镜像 FROM node:18-alpine # 在FROM之后重新声明ARG,确保当前构建阶段能访问 ARG VAR_TEST # 设置容器内工作目录 WORKDIR /app # 复制package文件 COPY package*.json ./ # 安装项目依赖 RUN npm cache clean --force RUN npm install # 复制项目所有文件 COPY . . # 将ARG转为环境变量供应用使用 ENV VAR_TEST=$VAR_TEST # 调试打印变量 RUN echo $VAR_TEST # 构建应用 RUN npm run build # 清理开发依赖 RUN npm prune --production # 暴露应用端口 EXPOSE 3000 # 启动应用 CMD ["npm", "start"]
2. Next.js环境变量配置方式不匹配服务端运行需求
问题原因:Next.js的nextConfig.env是构建时注入的变量,如果构建时process.env.VAR_TEST为空,最终服务端也无法获取到值。若需要服务端在运行时读取环境变量,需使用runtimeConfig。
修复后的Next.js配置:
/** @type {import('next').NextConfig} */ const nextConfig = { runtimeConfig: { // 仅服务端运行时可访问该变量 VAR_TEST: process.env.VAR_TEST, }, }; module.exports = nextConfig;
服务端代码中获取变量的方式:
// 服务端组件或API路由中 import getConfig from 'next/config'; const { serverRuntimeConfig } = getConfig(); console.log('Test : ', serverRuntimeConfig.VAR_TEST);
3. Jenkins Pipeline脚本中的引号转义错误
问题原因:Pipeline的sh脚本中使用了"转义引号,这会导致shell无法正确解析变量$VAR_TEST。
修复后的Pipeline关键阶段:
stage('Build Docker Image') { steps { withCredentials([string(credentialsId: 'VAR_TEST', variable: 'VAR_TEST')]) { sh ''' docker build --build-arg VAR_TEST="$VAR_TEST" -t next:latest . ''' } } } stage('Run Docker Container') { steps { withCredentials([string(credentialsId: 'VAR_TEST', variable: 'VAR_TEST')]) { sh ''' docker run -d -e VAR_TEST="$VAR_TEST" -p 3000:3000 --name next_container next:latest ''' } } }
验证步骤
- 重新运行Jenkins Pipeline构建部署
- 进入容器执行
echo $VAR_TEST确认值存在 - 查看Next.js服务端日志,确认变量已正常输出
内容的提问来源于stack exchange,提问作者Serial Geeker
相关产品推荐
相关产品推荐

