Windows环境下Docker读取环境变量失败致容器启动异常
问题:Windows下Docker容器内Node应用无法读取docker-compose环境变量
同一容器内的两个应用均从docker-compose.yml读取环境变量,Linux环境启动正常,但Windows环境中其中一个应用加载环境变量失败,报错显示NATS连接URL参数全为undefined。尽管Docker Desktop的Inspect窗口显示环境变量已存在,修改环境变量引号格式也未能解决问题,推测是Linux与Windows的格式差异导致。
错误日志
internal/url.js:243 throw error; ^ TypeError [ERR_INVALID_URL]: Invalid URL: nats://undefined:undefined@undefined:undefined at onParseError (internal/url.js:241:17) at new URL (internal/url.js:319:5) at Client.parseOptions (/opt/node_app/node_modules/nats/lib/nats.js:428:34) at new Client (/opt/node_app/node_modules/nats/lib/nats.js:221:8) at Object.exports.connect (/opt/node_app/node_modules/nats/lib/nats.js:250:10) at Object.<anonymous> (/opt/node_app/lib/nats.js:6:19) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! ms_template@1.0.0 start: `cross-env node index.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the ms_template@1.0.0 start script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
docker-compose环境变量配置
environment: server_user: "user" server_pass: "pass" server_port: 1234 server_ip: nats node_env: production api_host: http://localhost:1234/api node_tls_reject_unauthorized: 0
解决方案
- 修正环境变量读取方式:Windows环境下,Docker Compose传递的环境变量名会被转为全大写,Node应用中需用
process.env.SERVER_USER这类全大写的键名读取,而非原配置中的小写下划线格式(如process.env.server_user)。 - 统一文件换行格式:将docker-compose.yml文件的换行符从CRLF(Windows)改为LF(Linux),可通过VS Code等编辑器右下角的换行符切换功能实现。
- 改用.env文件管理变量:把环境变量写入
.env文件,在docker-compose.yml中通过env_file: .env引用,避免跨平台格式问题。示例:.env文件内容:
docker-compose.yml中配置:SERVER_USER=user SERVER_PASS=pass SERVER_PORT=1234 SERVER_IP=nats NODE_ENV=production API_HOST=http://localhost:1234/api NODE_TLS_REJECT_UNAUTHORIZED=0env_file: .env - 验证环境变量传递:在Node应用中添加
console.log(process.env)代码,启动后查看输出,确认环境变量是否真的被容器接收,定位是读取问题还是传递问题。
内容的提问来源于stack exchange,提问作者Casting Spell
相关产品推荐
相关产品推荐

