【问题标题】:Cannot find module for a node js app running in a docker compose environment找不到在 docker compose 环境中运行的节点 js 应用程序的模块
【发布时间】:2017-06-21 18:33:45
【问题描述】:

对于我的新手问题,我很抱歉,但我在解决这个错误时遇到了糟糕的一天,我有一个 Express 应用程序,我正在尝试在 docker compose 中运行它。 我用过这个 Dockerfile:

FROM mhart/alpine-node
RUN mkdir -p /usr/src/app
RUN chmod -R 777 /usr/src/app
WORKDIR /usr/src/app
RUN npm install node-gyp -g
RUN npm install nodemon -g
ENV NODE_ENV development
EXPOSE 3000

我的 docker-compose 文件的这一部分:

backend:
    mem_limit: 100m
    build:
      context: .
      dockerfile: dockerfiles/node/Dockerfile
    command: npm start
    depends_on:
      - mongo
      - elasticsearch
    volumes:
      - ./backend/:/usr/src/app
    ports:
      - 3000:3000
    links:
      - "mongo:mongo"
      - "elasticsearch:elasticsearch"

当我做 docker-compose up 时,我得到这个错误:

backend_1        | npm info it worked if it ends with ok
backend_1        | npm info using npm@3.10.10
backend_1        | npm info using node@v6.9.5
backend_1        | npm info lifecycle service-designer@1.0.0~prestart: service-designer@1.0.0
backend_1        | npm info lifecycle service-designer@1.0.0~start: service-designer@1.0.0
backend_1        | 
backend_1        | > service-designer@1.0.0 start /usr/src/app
backend_1        | > nodemon index.js
backend_1        | 
backend_1        | [nodemon] 1.11.0
backend_1        | [nodemon] to restart at any time, enter `rs`
backend_1        | [nodemon] watching: *.*
backend_1        | [nodemon] starting `node index.js`
backend_1        | module.js:471
backend_1        |     throw err;
backend_1        |     ^
backend_1        | 
backend_1        | Error: Cannot find module 'dotenv'
backend_1        |     at Function.Module._resolveFilename (module.js:469:15)
backend_1        |     at Function.Module._load (module.js:417:25)
backend_1        |     at Module.require (module.js:497:17)
backend_1        |     at require (internal/module.js:20:19)
backend_1        |     at Object.<anonymous> (/usr/src/app/index.js:1:63)
backend_1        |     at Module._compile (module.js:570:32)
backend_1        |     at Object.Module._extensions..js (module.js:579:10)
backend_1        |     at Module.load (module.js:487:32)
backend_1        |     at tryModuleLoad (module.js:446:12)
backend_1        |     at Function.Module._load (module.js:438:3)
backend_1        | [nodemon] app crashed - waiting for file changes before starting...

如果我在 backend 容器中执行 ls -al,我会获得后端应用程序文件夹内容的完整列表,但听起来 node_modules 依赖项无法识别。

【问题讨论】:

    标签: node.js docker npm docker-compose


    【解决方案1】:

    您需要在容器中安装依赖项,而您的 Dockerfile 中缺少该依赖项。

    常见的方法是创建一个已经知道您的应用程序的 Dockerfile,并使其复制您的 package.json 文件并执行 npm install

    这允许您的容器在您以后运行应用程序时找到所有代码依赖项。

    请参见此处的示例: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

    样本Dockerfile

    FROM node:boron
    
    # Create app directory
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    # Install app dependencies
    COPY package.json /usr/src/app/
    RUN npm install
    
    # Bundle app source
    COPY . /usr/src/app
    
    EXPOSE 8080
    CMD [ "npm", "start" ]
    

    当然,您可能需要为 COPY 命令调整路径。

    【讨论】:

    • 我遵循了相同的指南,但我仍然遇到同样的问题
    • 您的 Dockerfile 缺少所有 package.json 内容,或者您​​没有粘贴完整内容。您的问题中根本没有npm install,这就是node_modules 中没有任何内容的原因。仔细检查容器内的路径,即您的节点代码与您的 node_modules 位于同一文件夹中。您的代码将使用 Docker-compose 中的 volume 挂载,但依赖项将来自您的 Dockerfile
    • 实际上,我的 WORKDIR 包含我所有的项目文件,但是在启动应用程序时,它无法从 node_modules 文件夹中获取依赖项!!!
    • FROM node:boron RUN mkdir -p /usr/src/app WORKDIR /usr/src/app RUN npm install node-gyp -g RUN npm install nodemon -g COPY backend/ /usr/src/app/ RUN npm install ENV NODE_ENV development EXPOSE 3000 兄弟,我试过这个配置,每次都会出现同样的错误,当我用“ls -al”替换“npm start”时,我列出了所有代码和依赖项,但是运行 Node JS 应用程序时,express 等依赖项似乎未定义。我真的希望你能得到它!
    • 不,和文章中的不一样。您只需复制(在 Dockerfile 中)package.json,然后使用 Docker-compose.yaml 中的代码添加卷。
    【解决方案2】:

    如果您的 Dockerfilepackage.json 文件正确但仍然存在问题:

    1. 确保您已重建容器映像。

    2. 试试

    docker-compose down -v

    在使用docker-compose up 再次启动容器之前。

    这会删除所有卷。

    【讨论】:

    • 在使用节点模块来回切换时,这对我有用。无论如何,也许您应该稍微突出显示“这会删除所有卷”,因为如果您定义了其中的任何一个,它也会删除数据库的卷。
    【解决方案3】:

    我在运行docker-compose up 时也遇到了同样的问题。

    通过运行 docker-compose up --build 而不是 docker-compose up 解决了问题。

    【讨论】:

    • 正是我的问题,因为 docker-compose up 从未重新运行 npm install 命令,因此没有安装新软件包。
    • 我在运行这个命令时也遇到了同样的问题,它解决了我的问题docker-compose up --build
    【解决方案4】:

    npm install添加到Dockerfile后,添加node_modules到volumes

    volumes:
          - ./backend/:/usr/src/app
          - /usr/src/app/node_modules
    

    【讨论】:

    • 很好的解决方案!!!!有时您在本地的 node_modules 已过时,可以使用它来覆盖原始本地 node_modules
    • 这行得通,但只能采用这种 EXACT 格式。
    • 这对我有用。
    • 第二卷有什么作用?
    【解决方案5】:

    我遇到了同样的问题,您只需运行 npm i 来安装所有依赖项,然后重新构建,问题就解决了

    【讨论】:

      【解决方案6】:

      这发生在我身上,因为我的文件名是大写的。

      推荐的是 将文件重命名为小写

      删除 dist 文件夹

      再次运行

      npm run start:dev
      

      生成一个新的 dist 文件夹。

      再次运行

      docker build -t <name> .
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        • 2018-02-08
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 2018-12-07
        相关资源
        最近更新 更多