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