web-dev-qa-db-fra.com

ECONNREFUSED pour Postgres sur nodeJS avec des dockers

Je construis une application fonctionnant sur NodeJS en utilisant postgresql . J'utilise SequelizeJS en tant qu'ORM . Pour éviter d'utiliser de vrais démons postgres et d'avoir des nœuds sur mon propre appareil, j'utilise des conteneurs avec docker-compose.

quand je lance docker-compose upit démarre la base de données pg

database system is ready to accept connections

et le serveur nodejs . mais le serveur ne peut pas se connecter à la base de données.

Error: connect ECONNREFUSED 127.0.01:5432

Si j'essaye de faire tourner le serveur sans utiliser de conteneurs (avec de vrais noeuds et postgresd sur ma machine), ça marche.

Mais je veux que cela fonctionne correctement avec les conteneurs. Je ne comprends pas ce que je fais mal.

voici le fichier docker-compose.yml

web:
  image: node
  command: npm start
  ports:
    - "8000:4242"
  links:
    - db
  working_dir: /src
  environment:
    SEQ_DB: mydatabase
    SEQ_USER: username
    SEQ_PW: pgpassword
    PORT: 4242
    DATABASE_URL: postgres://username:[email protected]:5432/mydatabase
  volumes:
    - ./:/src
db:
  image: postgres
  ports:
  - "5432:5432"
  environment:
    POSTGRES_USER: username
    POSTGRES_PASSWORD: pgpassword

Quelqu'un peut-il m'aider, s'il vous plaît?

(Quelqu'un qui aime docker :))

23
Stainz42

Votre DATABASE_URL fait référence à 127.0.0.1, qui est l'adaptateur de bouclage (plus ici ). Cela signifie "se connecter à moi-même". 

Lorsque vous exécutez les deux applications (sans utiliser Docker) sur le même hôte, elles sont toutes deux adressables sur le même adaptateur (également appelé localhost).

Lorsque vous exécutez les deux applications dans des conteneurs, elles ne sont pas toutes les deux sur localhost, comme auparavant. Au lieu de cela, vous devez faire pointer le conteneur web vers l'adresse IP du conteneur db sur l'adaptateur docker0 - que docker-compose définit pour vous.

Changement:

DATABASE_URL: postgres://username:[email protected]:5432/mydatabase

à 

DATABASE_URL: postgres://username:pgpassword@db:5432/mydatabase

Cela fonctionne grâce aux liens Docker: le conteneur web a un fichier (/etc/hosts) avec une entrée db pointant vers l’adresse IP où se trouve le conteneur db. Il s’agit du premier endroit où un système (dans ce cas, le conteneur) examinera les tentatives de résolution des noms d’hôte. 

39
Andy

Si vous envoyez des vars de base de données séparément. Vous pouvez affecter un hôte de base de données. 

DB_Host=<POSTGRES_SERVICE_NAME> #in your case "db" from docker-compose file.
0
MED