错误:使用 docker-compose 时找不到模块“/usr/src/app/nodemon”

Posted

技术标签:

【中文标题】错误:使用 docker-compose 时找不到模块“/usr/src/app/nodemon”【英文标题】:Error: Cannot find module '/usr/src/app/nodemon' while using docker-compose 【发布时间】:2021-08-07 12:55:36 【问题描述】:

我正在尝试创建一个 docker-compose.yml,以便能够在与 docker 相同的网络中同时使用我的后端和前端 API 来运行我的 crud-admin 面板。这是我第一次使用“docker-compose”文件与 docker 一起部署。通常我使用普通的 Dockerfile 部署每个 API。

运行命令时:docker-compose up --build 我得到错误:

Error: Cannot find module '/usr/src/app/nodemon'

我有:

即使我的用户已添加到 docker 组,也尝试使用 sudo 我的用户有 sudo 权限 我已尝试更新

在发布我的 Dockerfile 和 docker compose 之前,这是我的文件夹结构:

the-admin-panel
│
├──frontend(reactjs/nextjs)
│  ├─ .next
│  ├─ components
│  ├─ content
│  ├─ helper
│  ├─ pages
│  ├─ public
│  ├─ services
│  ├─ static
│  ├─ next.config
│  ├─ next-env.d
│  ├─ package.json
│  ├─ package-lock.json
│  ├─ tsconfig.json
│  ├─ Dockerfile
│  ├─ .dockerignore
│  
│
├──backend(nodejs)
│  ├─ api
│  ├─ startup
│  ├─ middleware
│  ├─ models
│  ├─ server.js
│  ├─ package.json
│  ├─ package-lock.json
│  ├─ .env
│  ├─ Dockerfile
│  ├─ .dockerignore
│  
├──docker-compose.yml

目前前端还没有完成,所以我现在只尝试部署后端,所以我现在专注于这部分。

这是我后端的 Dockerfile:

FROM node:13-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 5000
CMD [ "nodemon", "server.js"]

如您所见,我尝试使用“nodemon”运行它。

最后,这是我的 docker-compose.yml 文件(请注意,由于前端 api 尚未完成,所以我已经注释了前端部分中的所有行)

version: '3'
services:

#set up the frontend
  #frontend:
  #  build:
  #    context: frontend
  #    dockerfile: Dockerfile
  #  image: frontend
  #    - $PWD:/usr/src/app
  #    - /usr/src/app/node_modules
  #  restart: always
  #  ports:
  #    - "3000:3000"
  #  networks:
  #    testnetwork

#set up the backend
  backend:
    build:
      context: backend
      dockerfile: Dockerfile
    image: nodejs-restapi
    #- $PWD:/usr/src/app
    #- /usr/src/app/node_modules

    restart: always
    ports:
      - "5000:5000"
    networks:
            testnetwork:


# Set up shared network
networks:
  testnetwork:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.0.0.0/8

如果需要,这是我的 package.json 文件:


  "name": "..",
  "version": "1.0.0",
  "description": "..",
  "main": "server.js",
  "scripts": 
    "start": "nodemon server.js"
  ,
  "author": "tim",
  "license": "ISC",
  "dependencies": 
    "bcrypt": "^5.0.1",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "fastest-validator": "^1.10.0",
    "helmet": "^4.4.1",
    "jsonwebtoken": "^8.5.1",
    "lodash": "^4.17.21",
    "mysql": "^2.18.1"
  ,
  "devDependencies": 
    "nodemon": "^2.0.7"
  

有人可以帮我解决这个 nodemon 问题吗?

【问题讨论】:

也包括你的 package.json 现在包括在内。 尝试运行CMD ["./node_modules/.bin/nodemon", "server.js"] 【参考方案1】:

我只是建议不要在 docker 映像中使用 nodemonnodemon 是一种开发工具,我认为在生产环境/您部署到的任何其他环境中运行它没有多大用处。

只需将后端Dockerfile 中的最后一行更改为 CMD [ "node", "server.js"]

【讨论】:

我实际上是像您建议的那样使用 CMD。但是其他人告诉我将“node”更改为“nodemon”以便能够使用nodemon,我可能需要使用它以便能够在我上传新文件时自动重新加载docker容器。 您上传到容器的文件类型是什么?如果您要发布后端的新版本,您应该运行一个新容器,而不是更新当前容器中的文件,这就是容器的全部意义所在。它们注定是短暂的。如果是别的,我不明白为什么服务器必须重新启动作为对文件上传的反应。请详细说明。 目前它是供开发人员使用的开发。这就是为什么。 为什么要使用 docker 容器来运行正在开发的服务器?我不清楚,但我很确定你可以在图片中不使用 nodemon【参考方案2】:

我相信这只是一个试验。因此,如果没有太多的生产级调整,我建议您尝试更改您的 dockerfile。

FROM node:13-alpine

COPY . /usr/src/app
WORKDIR /usr/src/app

RUN npm install
RUN npm install -g nodemon

EXPOSE 5000
CMD [ "nodemon", "server.js"]

【讨论】:

我试过了,还是一样:backend_1 |内部/模块/cjs/loader.js:965 backend_1 |抛出错误;后端_1 |错误:找不到模块“/usr/src/app/nodemon”后端_1 |在 Function.Module._resolveFilename (internal/modules/cjs/loader.js:962:15) backend_1 |在 Function.Module._load (internal/modules/cjs/loader.js:838:27) backend_1 |在 Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) backend_1 |在 internal/main/run_main_module.js:17:47 backend_1 |代码:'MODULE_NOT_FOUND',后端_1 |要求堆栈:[] 执行此操作时是否遇到相同的错误:CMD [ "node", "server.js"] 不,当使用“node”代替时,它工作得很好。 尝试在 EXPOSE 命令之前添加此命令RUN npm install -g nodemon 这似乎工作!但是这个 Cmd 行应该仍然是这样的: CMD [ "node", "server.js"] 还是我应该尝试将其更改为: CMD [ "nodemon", "server.js"] ?编辑:我测试过,它也可以在 CMD 中使用“nodemon”而不是“node”!谢谢!!【参考方案3】:

好的,感谢 Charlie,解决方案是在 Dockerfile 中添加了“RUN npm install -g nodemon”。

FROM node:13-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm install -g nodemon  #this was needed in order to make it work

EXPOSE 5000

CMD [ "nodemon", "server.js"] 

【讨论】:

以上是关于错误:使用 docker-compose 时找不到模块“/usr/src/app/nodemon”的主要内容,如果未能解决你的问题,请参考以下文章

在docker compose yml文件中设置环境变量时找不到文件错误

在 docker 中与 Zipkin 和 kafka 一起使用时找不到 zipkin2.reporter.Sender bean

使用 Laravel 路由时找不到 404 错误

错误:使用 Ionic 时找不到模块“../lib/utils/unsupported.js”

使用 npm 命令时找不到模块“npmlog”错误消息

错误:使用节点命令运行 JS 文件时找不到模块“firebase”