找不到在 docker compose 环境中运行的节点 js 应用程序的模块

新手上路,请多包涵

对于我的新手问题,我很抱歉,但是我在解决这个错误时遇到了糟糕的一天,我有一个 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...

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

原文由 jemlifathi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 892
2 个回答

您需要在 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 命令调整路径。

原文由 CharlieBrown 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

  2. 尝试

docker-compose down -v

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

这将删除所有卷。

原文由 M3RS 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题