web-dev-qa-db-ja.com

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 [email protected]
backend_1        | npm info using [email protected]
backend_1        | npm info lifecycle [email protected]~prestart: [email protected]
backend_1        | npm info lifecycle [email protected]~start: [email protected]
backend_1        | 
backend_1        | > [email protected] 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 -albackendコンテナ、バックエンドアプリフォルダーのコンテンツの完全なリストを取得しますが、node_modulesの依存関係のように聞こえます認識されません。

9
jemlifathi

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コマンドのパスを調整する必要があるかもしれません。

15
CharlieBrown

Dockerfileおよびpackage.jsonファイルが正しく、それでも問題がある場合:

1)コンテナイメージを再構築したことを確認してください。

2)試してみる

docker-compose down -v

docker-compose upでコンテナを再び開始する前に。

すべてのボリュームを削除します。

2
M3RS

docker-compose upを実行すると、今日も同じ問題に直面しました。

docker-compose up --buildの代わりにdocker-compose upを実行することで問題を解決しました。

1
Nishanth