简体   繁体   中英

Postgres ECONNREFUSED on Docker Compose with NodeJS

I get an ECONNREFUSED when trying to connect to a postgres server in docker from a NodeJS app in docker when running both via docker-compose. However I can connect from my host machine. Here is my docker-compose.yml:

version: "2.4"

services:
  api:
    build: 
      context: .
      target: dev
    depends_on: 
      - postgres
    ports: 
      - "8080:8080"
      - "9229:9229"
    networks:
      - backend
    environment:
      - NODE_ENV=development
      - PGHOST=postgres
      - PGPASSWORD=12345678
      - PGUSER=test
      - PGDATABASE=test
      - PGPORT=5433
    volumes: 
      - .:/node/app
      - /node/app/node_modules # Use empty volume to hide the node_modules from the host os

  postgres:
    image: postgres:11
    restart: always
    ports:
    - "5433:5432"
    networks:
      - backend
    volumes:
      - db-data:/var/lib/postgresql/data
    environment: 
      POSTGRES_PASSWORD: 12345678
      POSTGRES_USER: test
      POSTGRES_DB: test

networks:
  backend:

volumes:
    db-data:

The nodeJS code:

const client = new Client({
      user: process.env.PGUSER,
      host: process.env.PGHOST,
      database: process.env.PGDATABASE,
      password: process.env.PGPASSWORD,
      port: Number(process.env.PGPORT),
    });
client.connect();

The error:

{ Error: connect ECONNREFUSED 172.22.0.2:5433
api_1   |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14)
api_1   |   errno: 'ECONNREFUSED',
api_1   |   code: 'ECONNREFUSED',
api_1   |   syscall: 'connect',
api_1   |   address: '172.22.0.2',
api_1   |   port: 5433 }

At the same time I can connect from the host OS to the database server without any problems. Is there any problems with networking?

Edit: The dB server is ready to accept connections before the nodejs app tries that (I also tried with retrying the connection from within the nodejs app).

No, there is nothing wrong with networking. Just because you're connecting on the wrong port.

Inside compose network, your postgres container exposed 5432 port so it only accept the request via that port inside the compose network. So just need to change PGPORT=5433 to PGPORT=5432 .

The reason why you can access from your host OS is because docker-compose mapped your port 5433:5432 so all request to 5433 from outside (host OS) will be pass to 5432 inside your compose network.

Hope that clear enough for you to solve the issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM