首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么dotenv没有加载到docker中,但在主机上工作正常?

为什么dotenv没有加载到docker中,但在主机上工作正常?
EN

Stack Overflow用户
提问于 2019-05-11 22:27:30
回答 1查看 4.4K关注 0票数 3

我想构建一个Docker镜像来运行我的node.js应用程序。我使用dotenv npm包来存储环境变量。.env位于项目的根目录中。当我运行npm脚本,从主机启动应用程序(npm run start_in_docker)时,一切都运行得很好。然而,当我运行Docker容器时,我得到了以下错误:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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脚本部分:

代码语言:javascript
运行
复制
"scripts": {
    "start_in_docker": "NODE_ENV=development DEBUG=server:*,classes:*,middleware,utils node src/server/main.js",
}

这就是我在main.js文件中需要dotenv的方式:

代码语言:javascript
运行
复制
require('dotenv').config();

我尝试在('dotenv').config()中指定绝对路径,但不起作用。奇怪的是,如果我先运行容器外壳(docker run -it myimage /bin/ash),然后再运行npm run start_in_docker,它也能正常工作。当然,dotenv在我的package.json中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-11 23:19:29

我认为这是由以下原因引起的:

代码语言:javascript
运行
复制
volumes:
  - ".:/usr/src/app"

在docker-compose文件中。这会将当前目录链接到应用程序文件夹,这意味着包括node_modules在内的所有内容都将被替换。

请尝试从docker-compose中删除卷,并查看是否正常工作。

当您运行docker run -it myimage /bin/sh时,它不会链接卷,这意味着它将使用正确的node_modules,这就是为什么它在使用该why时可以工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56091220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档