Docker Compose: NodeJS + MongoDB

Я не могу заставить свою докеру сочинять работу.

Здесь мой файл докеров:

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

Мой docker-compose.yml

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

И в 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);

как из дублированного из этого репо: https://github.com/projectweekend/Node-Backend-Seed но process.env.DB_1_PORT пуст. Как его добавить?

Спасибо

Ответ 1

Извините @gettho.child, я принял ваш ответ слишком быстро. Я думал, что это работает, но это не так. Я сообщу здесь свое окончательное решение, так как я очень много пытался добиться этого.

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

И интересные примеры 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);

Что касается process.env.DB_PORT, я много пробовал. Если он не работает из коробки, я предлагаю console.log(process.env); и искать mongo IP.

Конечный URL должен выглядеть так: mongodb://172.17.0.76:27017/myapp

Удачи, это того стоит, Докер потрясающий!


EDIT:

Если вышеописанное работает, я обнаружил техно-агностический рабочий процесс, выполнив:

  • docker-compose run web /bin/bash
  • и там работает printenv

Надеюсь, это не слишком много саморекламы, но я написал двойную статью по этой теме, которая может помочь некоторым читателям: https://augustin-riedinger.fr/en/resources/using-docker-as-a-development-environment-part-1/

Приветствия

Ответ 2

Убедитесь, что mongoDB IP (и порт) в файле "Server.js" установлен в "PORT_27017_TCP_ADDR" (также проверьте порт) - можно найти при запуске "docker exec {веб-контейнер контейнера id] env".

Ответ 3

Ваш сборщик докеров должен быть

environment:
   - MONGODB=3000

Подробнее о сопоставлении переменных окружения см. эту ссылку. Вы указываете переменную окружения как PORT вместо MONGODB.