web-dev-qa-db-fra.com

Impossible de trouver le module pour une application node js exécutée dans un environnement de composition docker

Je suis désolé pour ma toute nouvelle question, mais j'ai une journée terrible à trouver cette erreur, j'ai une application Express et j'essaie de l'exécuter dans Docker Composer. J'ai utilisé ce 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

Et cette partie de mon fichier 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"

Quand je fais docker-compose, j'obtiens cette erreur:

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...

Si je fais ls -al dans le conteneur backend , j'obtiens une liste complète du contenu de mon dossier d'application backend, mais cela ressemble à des dépendances de node_modules ne sont pas reconnus.

9
jemlifathi

Vous devez installer les dépendances dans le conteneur, qui est absent de votre Dockerfile.

La manière la plus courante consiste à créer un Dockerfile qui connaît déjà votre application et à lui faire copier votre package.json fichier et effectuer un npm install.

Cela permet à votre conteneur de trouver toutes vos dépendances de code lorsque vous exécuterez ultérieurement votre application.

Voir et exemple ici: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

L'exemple 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" ]

Bien sûr, vous devrez peut-être adapter les chemins pour la commande COPY.

15
CharlieBrown

Si vos Dockerfile et package.json les fichiers sont corrects et ont toujours le problème:

1) Assurez-vous d'avoir reconstruit vos images de conteneur.

2) Essayez

docker-compose down -v

avant de redémarrer les conteneurs avec docker-compose up.

Il supprime tous les volumes.

2
M3RS

J'ai également rencontré le même problème aujourd'hui lorsque je lance docker-compose up.

Le problème a été résolu en exécutant docker-compose up --build au lieu de docker-compose up.

1
Nishanth