Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么dotenv不在docker中加载,但在主机中运行良好?_Node.js_Docker_Environment Variables_Npm Install_Dotenv - Fatal编程技术网

Node.js 为什么dotenv不在docker中加载,但在主机中运行良好?

Node.js 为什么dotenv不在docker中加载,但在主机中运行良好?,node.js,docker,environment-variables,npm-install,dotenv,Node.js,Docker,Environment Variables,Npm Install,Dotenv,我想构建一个Docker映像,它将运行node.js应用程序。我正在使用npm包来存储环境变量。.env位于项目的根目录中。当我从主机运行启动应用程序的npm脚本(npm run start_in_docker)时,一切都正常工作。但是,当我运行Docker容器时,会出现以下错误: internal/modules/cjs/loader.js:584 throw err; ^ Error: Cannot find module 'dotenv' at Function.

我想构建一个Docker映像,它将运行node.js应用程序。我正在使用npm包来存储环境变量。
.env
位于项目的根目录中。当我从主机运行启动应用程序的npm脚本(
npm run start_in_docker
)时,一切都正常工作。但是,当我运行Docker容器时,会出现以下错误:

internal/modules/cjs/loader.js:584
    throw err;
    ^

Error: Cannot find module 'dotenv'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)
    at Function.Module._load (internal/modules/cjs/loader.js:508:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/usr/src/app/src/server/main.js:3:1)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3) 
这是我的docker-compose.yml文件,它运行上面的Dockerfile:

version: '3'
services:
  appstore-bl-server:
    container_name: appstore-bl-server-production
    build:
      dockerfile: Dockerfile-prod
      context: .
    volumes:
      - ".:/usr/src/app"
    ports:
      - "3000:3000"
    networks:
      - appstore-net
    command: npm run start_in_docker

networks:
  appstore-net:
    driver: bridge
这是my package.json脚本部分:

"scripts": {
    "start_in_docker": "NODE_ENV=development DEBUG=server:*,classes:*,middleware,utils node src/server/main.js",
}
这就是我在main.js文件中要求的
dotenv

require('dotenv').config();

我尝试在
('dotenv').config()中指定绝对路径,但没有成功。奇怪的是,如果我运行容器shell(
docker run-it myimage/bin/ash
),然后在docker中运行
npm run start\u,它也会工作
dotenv
当然在我的package.json中。

我认为这是由以下原因造成的:

volumes:
  - ".:/usr/src/app"
在你的docker文件中。这会将当前目录链接到应用程序文件夹,意味着包括
node\u模块在内的所有内容都将被替换

尝试从
docker compose
中删除卷,然后查看它是否有效


运行
docker run-it myimage/bin/sh
时,它不会链接卷,这意味着它将使用正确的
节点\u模块
,这就是为什么它在使用时有效。

依赖项中的
dotenv
,还是
包中的
devdependency
。json
?@braza它在我的依赖项中。这确实解决了问题!非常感谢。但是,如果我仍然想要一个卷,我能以某种方式“保护”.env不被覆盖吗?您可以尝试创建一个卷来覆盖您想要覆盖的文件,例如,`-“/src:/usr/src/app/src”,或者,如果您只想持久保存某些文件或文件夹,如
node\u modules
,这里有一个答案:因为docker compose中的
,当我构建映像时,容器中
/usr/src/app
的内容将被主机的
/usr/src/app
的内容覆盖?是的,但只有在运行映像时,而不是在构建映像时。因此,docker映像中不存在这些文件,这就是您的
docker run
命令工作的原因,但是当您使用当前的
docker compose
config运行它时,它将在运行时装载卷,并用主机上的内容覆盖
/usr/src/app
volumes:
  - ".:/usr/src/app"