【问题标题】:Cannot find module "express" - docker-compose nodejs service找不到模块“express”-docker-compose nodejs 服务
【发布时间】:2021-09-03 11:46:06
【问题描述】:

我正在 docker 中运行一个小型 nodejs 微服务。当我使用docker run -p 3000:3000 {image-name} 独立运行容器时,它工作正常。但是,当我尝试从 docker-compose 运行它时,出现以下错误:

user_1     | Error: Cannot find module 'express'
user_1     | Require stack:
user_1     | - /usr/src/app/src/app.js
user_1     |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
user_1     |     at Function.Module._load (internal/modules/cjs/loader.js:667:27)
user_1     |     at Module.require (internal/modules/cjs/loader.js:887:19)
user_1     |     at require (internal/modules/cjs/helpers.js:74:18)
user_1     |     at Object.<anonymous> (/usr/src/app/src/app.js:12:17)
user_1     |     at Module._compile (internal/modules/cjs/loader.js:999:30)
user_1     |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
user_1     |     at Module.load (internal/modules/cjs/loader.js:863:32)
user_1     |     at Function.Module._load (internal/modules/cjs/loader.js:708:14)
user_1     |     at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) {
user_1     |   code: 'MODULE_NOT_FOUND',
user_1     |   requireStack: [ '/usr/src/app/src/app.js' ]
user_1     | }

这是我正在尝试运行的节点服务的 Dockerfile

FROM node:12

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app

# Install npm packages
RUN npm install

COPY . /usr/src/app


EXPOSE 3000

CMD ["npm", "run", "dev"]

补充一下,express 是在 package.json 文件中定义为依赖的,不是这样的。

这里是 docker-compose.yml(相关 sn-p)

    user: 
        build: ./user-service
        ports: 
            - "2008:3000"
        volumes:
            - type: bind
              source: ./user-service
              target: /usr/src/app
        working_dir: /usr/src/app
        networks: 
            - backend

    redis: 
        image: "redis:latest"
        ports: 
            - "6379:6379"
        networks:
            - backend

我绑定卷的原因是因为我想在进行更改时热重新加载应用程序。

我的尝试:

  • 重建图像

  • 在容器内打开一个 shell 以确保文件被正确映射 - 它们是。

  • 清除我所有的缓存和图像,并重建所有内容以确保没有缓存任何内容。

【问题讨论】:

  • 仔细检查容器内的目录,错误提示:requireStack: [ '/usr/src/app/src/app.js'。你可以注意到双 src/ 可能你有一个错误的地图文件夹或类似的东西。
  • 一开始是这么想的,但遗憾的是,它的映射正确。
  • 在这种情况下,为了进行调试,您必须启动容器,然后将外壳附加到它并尝试使用命令 npm install、npm start 并比较容器和您的开发环境之间的文件夹结构。
  • 你的问题解决了吗?

标签: node.js docker express docker-compose


【解决方案1】:

我最近遇到了同样的问题,通过为node_modules文件夹创建一个anonymous volume来解决它,以防止它被覆盖:

volumes: 
  - ./node:/usr/src/app
  # Anonymous volume:
  - /usr/src/app/node_modules

您还需要授予node 用户访问卷的权限:

RUN chown -R node:node node_modules

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 2017-01-23
    • 2021-08-06
    • 1970-01-01
    • 2022-01-15
    • 2023-02-03
    • 1970-01-01
    • 2018-02-08
    相关资源
    最近更新 更多