【问题标题】:Error while running Node application with Docker: db-on-docker@1.0.0 start: `node index.js`使用 Docker 运行 Node 应用程序时出错:db-on-docker@1.0.0 start: `node index.js`
【发布时间】:2022-01-31 03:07:26
【问题描述】:

我使用Docker 开发了一个Nodejs 应用程序,但是当我运行该应用程序时出现错误:

module.js:550
    throw err;
    ^

Error: Cannot find module 'express'
    at Function.Module._resolveFilename (module.js:548:15)
    at Function.Module._load (module.js:475:25)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/usr/src/app/index.js:1:81)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! db-on-docker@1.0.0 start: `node index.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the db-on-docker@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2022-01-30T05_34_13_500Z-debug.log

以下是我的文件: DockerFile 存在于 web 文件夹中:

FROM node:8

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 9000

CMD ["npm","start"]

CMD tail -f /dev/null

以下是我的docker-compose.yml 文件存在于我的root project folder 中:

version: '3'

services:
  db:
    container_name: db
    image: mysql:5.7
    volumes:
      - "./data/mysql:/var/lib/mysql:rw"
    environment:
      MYSQL_DATABASE: db
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: admin
      MYSQL_PASSWORD: 123456
      DATABASE_HOST: localhost
    restart: always

  web:
    container_name: web
    image: node:8
    volumes:
      - ./web:/usr/src/app
    working_dir: /usr/src/app
    depends_on:
      - db
    restart: on-failure
    command: "tail -f /dev/null"
    environment: ["project=${project}", "type=${type}"]

我做了以下事情:

  1. docker-compose build -d 加载所有图片。
  2. docker-comoise up -d 调出所有图像并使用docker-compose ps 确认相同。
  3. 然后使用命令docker-compose exec web sh -c "project=myproject type=New npm start" 运行应用程序

当我运行第三步时,我得到了上面提供的错误。当我开发应用程序时,这是以前工作的。现在我试图在另一个系统中运行相同的应用程序,但收到此错误。无法理解可能出现的问题。

我已经添加了express using npm install,所以我猜不是因为这个,而是因为npm ERR! Failed at the db-on-docker@1.0.0 start script. 行,我尝试使用npm install --save express 安装express,删除了node_modules 文件夹。尝试了npm install,但似乎没有什么对我有用。

有人可以告诉我我需要做什么吗?

【问题讨论】:

  • 执行 npm install -g express
  • 如何定义“启动”脚本?要进行测试,请尝试:CMD npm start
  • @Satya 非常感谢您的回复。我试过了,但仍然遇到同样的问题。能否请您提出一些替代方案。
  • @a_e 非常感谢您的回复。实际上,代码是由另一位开发人员开发的,所以我不完全确定 start script 是如何定义的,因为我是 docker and node js. I tried running npm start 的新手,但这不起作用并出现错误 missing script "start"。你能帮我解决这个问题吗?
  • 因为没有启动脚本,那么就从:CMD node index.js开始

标签: node.js docker npm docker-compose dockerfile


【解决方案1】:

您的docker-compose.yml 文件中缺少一个内容:

您没有告诉 docker 构建您的 Dockerfile,而是从 docker 注册表中获取映像 node:8,但是 docker 是如何知道您需要安装包的?

您必须在docker-compose.yml 文件中的web 服务下添加此块:

build:
      context: ./web

还有一点要提的是,您正在覆盖您在Dockerfile 中声明的默认命令,您可以从docker-compose.yml 文件中删除此行

command: "tail -f /dev/null"

老实说,我不知道你为什么需要这个。

您也可以尝试从Dockerfile中删除这条指令:

CMD tail -f /dev/null

我觉得npm start就够了

注意npm start要求你在package.json文件中定义入口点,否则会报错

一件事,并支持您在问题中提到的错误:

原因是因为容器找不到express模块安装在你正在使用的镜像中node:8在这种情况下,因为你只是使用镜像并映射你的项目目录到容器而不安装依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2017-11-07
    • 2019-11-04
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多