我很抱歉我的问题非常新手,但我有一个可怕的一天发现这个错误,我有一个快速的应用程序,我正试图在docker compose运行它.

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时,会出现以下错误:

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 _模块的依赖关系.

推荐答案

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

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

这允许容器在以后运行应用程序时查找所有代码依赖项.

请参见此处的示例:

样本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命令的路径.

Node.js相关问答推荐

Jest由于UUID而无法解析测试,即使在Jest中启用ESModule支持后也是如此

即使DDB键不存在, node Lambda也不会失败,并返回NULL作为结果

一个函数中的两个依赖的NodeJS数据库操作.如果第二个失败了怎么办?

如何在 ElectronJS 中播放音频文件

使用 NPM 8 安装本地构建

在 Docker 容器内创建一个 cron 作业(job)来执行 run.js 文件中的函数

如何从动态Typescript 文件加载模块

在express js模型中将js转换为Typescript 时Typescript 错误

部署云功能 Firebase/Stripe 时出错

AWS EC2 npm install 突然很慢

等到文件上传完成的有效方法(mongoose )

使用 grunt 服务器,如何将所有请求重定向到根 url?

`npm install` 以Killed结尾

Node JS:自动 Select `http.get`与`https.get`

eslint - vscode 的可选链接错误

Node.js、Cygwin 和 Socket.io 走进一家wine 吧……Node.js 抛出 ENOBUFS,所有人都死了

用一级 try ... catch 捕获 JavaScript Promise 中的错误

我应该如何在 webpack 中使用时刻时区?

node.js 服务器和 HTTP/2 (2.0) 与 express.js

AWS Lambda 函数写入 S3