it-swarm.com.de

ECONNREFUSED für Postgres auf nodeJS mit Dockern

Ich baue eine App, die auf NodeJS ausgeführt wird, indem Postgresql ..__ verwendet wird. Ich verwende SequelizeJS als ORM . Um die Verwendung eines echten Postgres-Daemons zu vermeiden und NodeJs auf meinem eigenen Gerät zu haben, verwende ich Container mit Docker-Compose.

wenn ich docker-compose upit starte, wird die pg-Datenbank gestartet

database system is ready to accept connections

und der nodejs-Server . Der Server kann jedoch keine Verbindung zur Datenbank herstellen.

Error: connect ECONNREFUSED 127.0.01:5432

Wenn ich versuche, den Server ohne Container auszuführen (mit echten nodejs und postgresd auf meinem Computer), funktioniert es.

Aber ich möchte, dass es korrekt mit Containern funktioniert. Ich verstehe nicht, was ich falsch mache.

hier ist die docker-compose.yml-Datei

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

Könnte mir bitte jemand helfen?

(jemand, der docker mag :))

23
Stainz42

Ihr DATABASE_URL bezieht sich auf 127.0.0.1, bei dem es sich um den Loopback-Adapter (mehr hier ) handelt. Dies bedeutet "Verbindung mit mir". 

Wenn beide Anwendungen (ohne Docker) auf demselben Host ausgeführt werden, können beide mit demselben Adapter (auch als localhost bezeichnet) adressiert werden.

Wenn beide Anwendungen in Containern ausgeführt werden, sind sie nicht wie zuvor auf localhost. Stattdessen müssen Sie den web-Container auf die IP-Adresse des db-Containers auf dem docker0-Adapter richten - was docker-compose für Sie festlegt.

Veränderung:

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

zu 

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

Dies funktioniert dank Docker-Links: Der web-Container verfügt über eine Datei (/etc/hosts) mit einem db-Eintrag, der auf die IP verweist, auf der sich der db-Container befindet. Dies ist der erste Ort, an dem ein System (in diesem Fall der Container) versucht, Hostnamen aufzulösen. 

39
Andy

Für weitere Leser, wenn Sie Docker desktop for Mac Verwenden, verwenden Sie Host.docker.internal Anstelle von localhost oder 127.0.0.1, Wie in doc angegeben . Ich bin auf dasselbe connection refused... Problem gestoßen. Backend api-service Konnte mit localhost/127.0.0.1 Keine Verbindung zu postgres herstellen. Unten sind meine Variablen docker-compose.yml und environment als Referenz aufgeführt:

version: "2"

services:
  api:
    container_name: "be"
    image: <image_name>:latest
    ports:
      - "8000:8000"
    environment:
      DB_Host: Host.docker.internal
      DB_USER: <your_user>
      DB_PASS: <your_pass>
    networks: 
      - mynw

  db:
    container_name: "psql"
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: <your_postgres_db_name>
      POSTGRES_USER: <your_postgres_user>
      POSTGRES_PASS: <your_postgres_pass>
    volumes:
      - ~/dbdata:/var/lib/postgresql/data
    networks:
      - mynw
1
Abu Shumon

Wenn Sie Datenbank-Vars separat senden. Sie können einen Datenbankhost zuweisen. 

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