2015-09-02 12 views
10

Ich kann nicht meinen Docker komponieren arbeiten.Docker Compose: NodeJS + MongoDB

Hier ist meine 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 

Mein Docker-compose.yml

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

Und in 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); 

wie aus dieser Repo dupliziert: https://github.com/projectweekend/Node-Backend-Seed aber process.env.DB_1_PORT ist leer. Wie kann ich es hinzufügen?

Dank

Antwort

21

Sorry @ gettho.child, ich habe Ihre Antwort zu schnell angenommen. Ich dachte, es funktioniert, aber es war nicht. Ich werde hier meine endgültige Lösung vorstellen, da ich mich ziemlich angestrengt habe, um es zu erreichen.

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 

Und die interessante app.js Extrakte:

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

In Bezug auf die process.env.DB_PORT Ich habe um viele Dinge ausprobiert. Wenn es nicht out-of-the-box funktioniert, empfehle ich console.log(process.env); und suchen Sie nach Mongo IP.

Die endgültige URL sollte wie folgt aussehen: mongodb://172.17.0.76:27017/myapp

Viel Glück, es lohnt sich, Dockarbeiter ist genial!


EDIT:

  • docker-compose run web /bin/bash
  • und dort printenv
läuft

:

Wenn die oben genannten Arbeiten, habe ich jetzt ein Techno-agnostisch Workflow, indem Sie gefunden Ich hoffe, das ist nicht zu viel Eigenwerbung, aber ich schrieb eine Doppel-Artikel e auf dem Thema, das einige der Leser helfen können: https://augustin-riedinger.fr/en/resources/using-docker-as-a-development-environment-part-1/

Prost

+0

Der Port unter Umgebung sollte wie 'PORT = 3000' deklariert werden, was ihn zu einer Umgebungsvariable beim Build macht. Sie können testen, indem Sie "echo $ PORT" verwenden, was "3000" ergeben sollte. –

+0

Yep, das ist, was ich in der 'Docker-compose.yml' kommentiert:' # dies optional ist, ausdrücklich erlaubt process.env.PORT anstelle eines rohen 3000' –

+0

Ich denke, zu verwenden, was @ GHETTO.CHiLD sagt, ist, dass PORT: 3000 sollte - PORT = 3000 sein. Ich entschuldige mich, ich weiß nicht, wie man diese Antwort formatiert. – Leon

0

Ihre Docker-compose sollte

sein
environment: 
    - MONGODB=3000 

Siehe this link Weitere Informationen zum Zuordnen von Umgebungsvariablen. Sie deklarieren die Umgebungsvariable als PORT anstelle von MONGODB.

+0

Nicht sicher, warum es funktionieren sollte, aber es tatsächlich tut. –

+0

In der Tat, tut es nicht, sorry. Ich habe meine Antwort gemeldet. –

1

Vergewissern Sie sich, dass mongoDB IP (und Port) in Ihrem Server.js 'Datei ist auf' PORT_27017_TCP_ADDR 'gesetzt (überprüfen Sie auch den Port) - kann gefunden werden, wenn' docker exec {web app container id} env 'ausgeführt wird.

+0

In der Tat. Jetzt störe ich nicht mehr. Ich führe 'docker-compose run web/bin/bash' und mache' printenv' von was auch immer im Container! –