ECONNREFUSED for Postgres on nodeJS with dockers

je construis une application fonctionnant sur NodeJS en utilisant postgresql. J'utilise SequelizeJS comme ORM. Pour éviter d'utiliser un vrai démon postgres et d'avoir des nodejs sur mon propre appareil, j'utilise des conteneurs avec docker-compose.

quand je lance docker-compose up il 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'essaie d'exécuter le serveur sans utiliser de conteneurs (avec des nodejs réels et postgresd sur ma machine) il travail.

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

ici docker-compose.yml le fichier

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:pgpassword@127.0.0.1:5432/mydatabase
  volumes:
    - ./:/src
db:
  image: postgres
  ports:
  - "5432:5432"
  environment:
    POSTGRES_USER: username
    POSTGRES_PASSWORD: pgpassword

quelqu'un Pourrait m'aider s'il vous plaît?

(quelqu'un qui aime docker :) )

19
demandé sur Andy 2015-10-27 02:47:25

1 réponses

DATABASE_URL se réfère à 127.0.0.1 adaptateur de boucle (plus d' ici). Cela signifie "se connecter à moi-même".

lors de l'exécution des deux applications (sans utiliser Docker) sur le même hôte, elles sont toutes les deux adressables sur le même adaptateur (aussi connu sous le nom de localhost).

lors de l'exécution des deux applications dans des conteneurs ils ne sont pas tous les deux sur localhost comme avant. Au lieu de cela, vous devez pointer le web container db adresse IP du conteneur sur le docker0 carte docker-compose jeux pour vous.

changement:

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

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

cela fonctionne grâce aux liens Docker: le web conteneur a un fichier (/etc/hosts) avec db entrée pointant vers l'IP que l' db conteneur est sur. C'est le premier endroit où un système (dans ce cas, le conteneur) regardera en essayant de résoudre les noms d'hôte.

32
répondu Andy 2017-04-13 12:22:42