容器中Node.js v22原生环境变量加载失败问题排查
解决容器中Node.js原生加载.env文件失败的问题
问题根源
- 路径无效:代码中
../../.env的相对路径在容器环境不成立——容器工作目录为/app,server.js位于/app/server/,../../指向容器中不存在的上级目录。 - 文件未复制:Docker构建上下文设为
backend目录,根目录的.env未被复制到容器内。 - 重复操作:
docker-compose.yml已通过env_file注入环境变量,代码手动加载属于冗余操作。
解决方案1:移除代码中的手动加载(推荐)
利用docker-compose的env_file配置,环境变量会自动注入容器,无需在代码中手动加载.env文件。
修改server.js,删除以下代码行:
process.loadEnvFile('../../.env')
直接通过process.env.NODE_LOCAL_PORT读取环境变量即可。
解决方案2:保留原生loadEnvFile的配置调整
如果坚持使用Node.js原生加载方法,需确保.env文件被正确复制到容器并修正路径:
步骤1:调整Docker构建上下文
修改docker-compose.yml的构建配置,将上下文改为项目根目录,让Docker能访问到根目录的.env:
services: server: build: context: ./ # 改为项目根目录 dockerfile: backend/Dockerfile # 其余配置保持不变
步骤2:修改Dockerfile复制.env文件
在backend/Dockerfile中添加复制.env的步骤:
# 复制根目录的.env到容器工作目录 COPY .env ./ # 其余指令保持不变
步骤3:修正代码中的路径
容器中.env位于/app目录,server.js在/app/server/,调整加载路径:
// 方法1:默认加载当前工作目录(/app)的.env process.loadEnvFile() // 方法2:明确指定相对路径 process.loadEnvFile('../.env')
验证
执行docker-compose up --build,服务应正常启动,不再出现ENOENT错误。
内容的提问来源于stack exchange,提问作者Jorge Leonardo
相关产品推荐
相关产品推荐

