簡體   English   中英

找不到在 docker compose 環境中運行的節點 js 應用程序的模塊

[英]Cannot find module for a node js app running in a docker compose environment

對於我的新手問題,我感到很抱歉,但是我在解決這個錯誤時遇到了糟糕的一天,我有一個 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 依賴項無法識別。

您需要在容器中安裝依賴項,而 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命令的路徑。

如果您的Dockerfilepackage.json文件是正確的並且仍然存在問題:

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

  2. 嘗試

docker-compose down -v

在使用docker-compose up再次啟動容器之前。

這將刪除所有卷。

當我運行docker-compose up時,我也遇到了同樣的問題。

通過運行docker-compose up --build而不是docker-compose up解決了問題。

npm install添加到 Dockerfile 后,將 node_modules 添加到卷

volumes:
      - ./backend/:/usr/src/app
      - /usr/src/app/node_modules

它發生在我身上,因為我的文件名是大寫的。

建議將文件重命名為小寫

刪除 dist 文件夾

再次運行

npm run start:dev

生成一個新的 dist 文件夾。

再次運行

docker build -t <name> .

如果你的 Dockerfiles 和 compose 文件是正確的,那么你應該這樣做 docker docker-compose build --no-cache然后你可以再次做docker-compose up 這為我解決了這個問題。

我有同樣的問題,你需要做的只是運行npm i來安裝所有依賴項,然后重建,問題解決了

確保在scripts對象的package.json中, npm start具有 nodemon 命令來運行您的應用程序

示例:如果您的應用程序由server.js文件提供服務

"scripts": {
    "start": "nodemon server.js",
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM