web-dev-qa-db-fra.com

Docker Compose: NodeJS + MongoDB

Je ne peux pas faire travailler mon docker.

Voici mon dockerfile:

FROM node:0.12
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD . /myapp
RUN npm install

Mon docker-compose.yml

db:
  image: mongo
  ports:
    - 27017
web:
  build: .
  command: npm start
  volumes:
    - .:/myapp
  ports:
    - 3000:3000
  links:
    - db
  environment:
    PORT: 3000

Et dans server.js:

  var MONGO_DB;
  var DOCKER_DB = process.env.DB_1_PORT;
  if ( DOCKER_DB ) {
    MONGO_DB = DOCKER_DB.replace( "tcp", "mongodb" ) + "/dev_db";
  } else {
    MONGO_DB = process.env.MONGODB;
  }

  mongoose.connect(MONGO_DB);

à partir de la copie de ce référentiel: https://github.com/projectweekend/Node-Backend-Seed mais process.env.DB_1_PORT est vide. Comment puis-je l'ajouter?

Merci

12
Augustin Riedinger

Désolé @ gettho.child, j'ai accepté votre réponse trop rapidement. Je pensais que ça fonctionnait mais ça ne l'était pas. Je vais vous présenter ici ma solution finale, car je me suis beaucoup battu pour y parvenir.

Dockerfile:

FROM node:0.12
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev libkrb5-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD package.json /myapp/package.json
RUN npm install
ADD . /myapp

docker-compose.yml:

db:
  image: mongo
  ports:
    - "27017:27017"
  command: "--smallfiles --logpath=/dev/null"
web:
  build: .
  command: node app.js
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db
  environment:
    PORT: 3000 # this is optional, allows express to use process.env.PORT instead of a raw 3000

Et les extraits intéressants de app.js:

var MONGO_DB;
var DOCKER_DB = process.env.DB_PORT;
if ( DOCKER_DB ) {
  MONGO_DB = DOCKER_DB.replace( 'tcp', 'mongodb' ) + '/myapp';
} else {
  MONGO_DB = process.env.MONGODB;
}
var retry = 0;
mongoose.connect(MONGO_DB);

app.listen(process.env.PORT || 3000);

En ce qui concerne le process.env.DB_PORT, j'ai essayé beaucoup de choses. Si cela ne fonctionne pas immédiatement, je suggère de console.log(process.env); et de rechercher l'adresse IP de Mongo. 

L'URL finale devrait ressembler à ceci: mongodb://172.17.0.76:27017/myapp

Bonne chance, ça vaut le coup, génial Docker!


MODIFIER:

Si cela fonctionne, je trouve maintenant un flux de travail techno-agnostique en exécutant: 

  • docker-compose run web /bin/bash
  • et là-bas en cours d'exécution printenv

J'espère que ce n'est pas trop de promotion personnelle, mais j'ai écrit un double article sur le sujet qui pourrait aider certains lecteurs: https://augustin-riedinger.fr/en/resources/using-docker-as-a- development-environment-part-1/

À votre santé

23

Assurez-vous que l'IP mongoDB (et le port) dans votre fichier 'Server.js' est défini sur 'PORT_27017_TCP_ADDR' (vérifiez également le port) - peut être trouvé lors de l'exécution de 'docker exec {id du conteneur de l'application Web} env'.

1
Asher A

Votre docker-compose devrait être 

environment:
   - MONGODB=3000

Voir ce lien pour plus d’informations sur les variables d’environnement de mappage. Vous déclarez la variable d'environnement PORT au lieu de MONGODB.

0
GHETTO.CHiLD