2015-09-02 25 views
10

Non riesco a far funzionare la finestra mobile.Docker Componi: NodeJS + MongoDB

Ecco la mia 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 

mia finestra mobile-compose.yml

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

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

dal duplicato da questa repo: https://github.com/projectweekend/Node-Backend-Seed ma process.env.DB_1_PORT è vuoto. Come posso aggiungerlo?

Grazie

risposta

21

Mi dispiace @ gettho.child, ho accettato la tua risposta troppo rapidamente. Pensavo che funzionasse, ma non lo era. Riporterò qui la mia soluzione finale dato che ho dovuto lottare un bel po 'per raggiungerlo.

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 

E i app.js interessanti estratti:

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

Per quanto riguarda l'process.env.DB_PORT Ho provato molte cose intorno. Se non funziona immediatamente, suggerisco di console.log(process.env); e cerca l'IP di mongo.

L'URL finale dovrebbe essere simile: mongodb://172.17.0.76:27017/myapp

Buona fortuna, ne vale la pena, di Docker impressionante!


EDIT:

Se le opere di cui sopra, ho trovato un flusso di lavoro tecnico-agnostic eseguendo:

  • docker-compose run web /bin/bash
  • e lì in esecuzione printenv

Spero che non si tratti di auto promozione ma ho scritto un doppio articolo e sul tema che può aiutare alcuni dei lettori: https://augustin-riedinger.fr/en/resources/using-docker-as-a-development-environment-part-1/

Acclamazioni

+0

la porta in ambiente deve essere dichiarata come "PORT = 3000', che la trasforma in una variabile di ambiente su build. puoi provare andando a "echo $ PORT" che dovrebbe produrre "3000". –

+0

Sì, questo è quello che ho commentato in 'docker-compose.yml':' # è opzionale, consente a express di utilizzare process.env.PORT invece di un grezzo 3000' –

+0

Penso che cosa sta dicendo @ GHETTO.CHiLD PORTA: 3000 dovrebbe essere - PORT = 3000. Le mie scuse non so come formattare questa risposta. – Leon

0

tua finestra mobile-composizione dovrebbe essere

environment: 
    - MONGODB=3000 

Vedi this link per maggiori informazioni sulle variabili d'ambiente mappatura. Stai dichiarando la variabile di ambiente come PORT anziché MONGODB.

+0

Non sono sicuro del motivo per cui dovrebbe funzionare, ma in realtà lo fa. –

+0

In effetti non lo fece, mi dispiace. Ho segnalato la mia risposta. –

1

Assicurarsi che MongoDB IP (e porta) nella 'Server.il file js 'è impostato su' PORT_27017_TCP_ADDR '(controlla anche la porta) - può essere trovato quando si esegue' docker exec {web app id contenitore} env '.

+0

Infatti. Ora non mi preoccupo più. Eseguo 'docker-componi esegui web/bin/bash' e creo' printenv' di qualsiasi cosa nel contenitore! –

Problemi correlati