Node.js容器读取docker-compose配置的环境变量返回undefined问题排查
解决方案
1. 清理旧容器后重新启动
修改docker-compose配置后直接执行docker-compose up会复用之前创建的旧容器,旧容器不会加载新的环境变量配置,优先执行以下命令重启服务:
docker-compose down && docker-compose up
如果需要同步重新构建镜像,可添加--build参数:
docker-compose down && docker-compose up --build
2. 检查dotenv依赖配置
如果你的Node项目引入了dotenv包加载本地环境变量,当你开启了override选项时(如代码中写了require('dotenv').config({ override: true })),dotenv会用本地.env文件的变量覆盖docker-compose传入的系统环境变量。如果本地.env文件没有声明REDIS_HOST和TEST两个变量,覆盖后这两个值就会变成undefined。
解决方法:
- 去掉dotenv配置里的
override: true参数 - 或在本地
.env文件中补上对应的变量值 - 或将docker-compose中定义的环境变量同步写到项目的
.env文件里
3. 检查启动脚本配置
查看package.json中dev脚本的配置,确认是否使用了会重置环境变量的工具:
- 如果使用pm2等进程管理工具启动项目,这类工具默认会隔离环境变量,需要额外在配置文件中添加
env配置项,或启动时添加--env参数传递环境变量。
4. 验证环境变量注入状态
可以直接进入运行的api容器,打印系统环境变量确认是否注入成功:
docker-compose exec api env
- 如果执行后能看到
REDIS_HOST=redis://redis:6379和TEST=123的输出,说明docker-compose配置没问题,问题出在Node项目的代码或者启动逻辑中 - 如果看不到这两个变量,说明docker-compose配置未生效,可检查是否有语法缩进错误,或docker版本是否兼容当前compose文件的语法版本
内容的提问来源于stack exchange,提问作者Lorza
相关产品推荐
相关产品推荐

