2015-09-02 2 views
10

Я не могу заставить свою работу докеров сочинять.Docker Compose: NodeJS + MongoDB

Вот мой 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 

Мой докер-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 пуст. Как его добавить?

Благодаря

ответ

21

Извините @ 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); и искать IP-адрес mongo.

Окончательный URL должен выглядеть следующим образом: mongodb://172.17.0.76:27017/myapp

Удачи, она стоит, Docker потрясающе!


EDIT:

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

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

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

Приветствия

+0

порт в среде должен быть объявлен как 'PORT = 3000', что превращает его в переменную среды при сборке. вы можете проверить, перейдя 'echo $ PORT', который должен произвести' 3000'. –

+0

Да, это то, что я прокомментировал в 'docker-compose.yml':' # это необязательно, позволяет выразить использование process.env.PORT вместо сырого 3000' –

+0

Я думаю, что @ GHETTO.CHILD говорит, что ПОРТ: 3000 должно быть - ПОРТ = 3000. Мои извинения Я не знаю, как отформатировать этот ответ. – Leon

0

Ваш докер-Compose должен быть

environment: 
    - MONGODB=3000 

См this link для получения дополнительной информации о переменных отображения среды. Вы объявляете переменную окружения как PORT вместо MONGODB.

+0

Не уверен, почему он должен работать, но на самом деле это делает. –

+0

На самом деле это не так, извините. Я сообщил о своем ответе. –

1

Убедитесь, что MongoDB IP (и порт) в вашем «Server.Файл js 'установлен в' PORT_27017_TCP_ADDR '(также проверить порт) - можно найти при запуске' docker exec {web-контейнер контейнера id} env '.

+0

Действительно. Теперь я больше не беспокоюсь. Я запускаю 'docker-compose run web/bin/bash' и создаю' printenv' все, что в контейнере! –