我想构建一个将运行我的node.js应用程序的Docker映像。我正在使用dotenv npm包来存储环境变量。 .env
位于项目的根目录。当我运行从主机启动应用程序(npm run start_in_docker
)的npm脚本时,一切运行正常。但是,当我运行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)
这是我的Dockerfile:
FROM node:10-alpine
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN apk add --update python
RUN apk add --update vim
RUN apk add --update sqlite
RUN npm install --only=production
# Bundle app source
COPY . .
EXPOSE 3000
RUN npm install --unsafe-perm=true sqlite3 -g
RUN npm install pm2 -g
# run node-gyp to build sqlite3
RUN cd /usr/src/app/node_modules/sqlite3 && npm run install
WORKDIR /usr/src/app
这是我的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
这是我的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()
中指定绝对路径,但是没有用。奇怪的是,如果我运行容器外壳程序(docker run -it myimage /bin/ash
)然后运行npm run start_in_docker
,它也将起作用。 dotenv
当然在我的package.json中。
答案 0 :(得分:1)
我认为这是由于:
volumes:
- ".:/usr/src/app"
在您的docker-compose文件中。这会将当前目录链接到app文件夹,这意味着包括node_modules
在内的所有内容都会被替换。
尝试从docker-compose
删除卷,看看它是否有效。
运行docker run -it myimage /bin/sh
时,它不会链接该卷,这意味着它将使用正确的node_modules
,这就是使用它时起作用的原因。