Postgres ECONNREFUSED на Docker Compose с NodeJS - PullRequest
0 голосов
/ 05 октября 2019

Я получаю ECONNREFUSED при попытке подключиться к серверу postgres в докере из приложения NodeJS в докере при запуске обоих через docker-compose. Однако я могу подключиться с моего компьютера. Вот мой 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:

Код узла JS:

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

Ошибка:

{ 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 }

В то же время я могу подключитьсяс хоста ОС на сервер базы данных без проблем. Есть ли проблемы с сетью?

Редактировать: сервер дБ готов принимать соединения до того, как приложение nodejs попытается это сделать (я также пытался повторить попытку подключения из приложения nodejs).

1 Ответ

2 голосов
/ 05 октября 2019

Нет, с сетью все в порядке. Просто потому, что вы подключаетесь не к тому порту.

Внутри составной сети ваш контейнер postgres выставил порт 5432, поэтому он принимает запрос только через этот порт внутри составной сети. Так что просто нужно изменить PGPORT=5433 на PGPORT=5432.

Причина, по которой вы можете получить доступ с вашей операционной системы, заключается в том, что docker-compose сопоставил ваш порт 5433:5432, поэтому все запросы на 5433 извне (хост ОС) будет передан на 5432 внутри вашей сети.

Надеюсь, что это достаточно ясно для решения проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...