Сервер в контейнере docker не может подключиться к базе данных postgres в другом контейнере docker - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть сервер узлов, который пытается подключиться к базе данных postgres, используя knex . Оба находятся в docker контейнерах с одной и той же пользовательской сетью. Я продолжаю получать сообщения ECONNREFUSED. Я покопался в контейнере базы данных и вижу, что моя БД (test_db) была создана psql, но у нее нет разрешений. После предоставления разрешений root у меня все те же проблемы. Я попытался удалить тома с помощью docker-compose down -v, но все равно не повезло. Я также попытался удалить knex и просто использовать node- postgres, но те же ошибки. Я также не могу подключиться к БД с хоста с помощью pgadmin. Буду признателен за любую помощь!

Вот мой docker -compose.yml

version: "3"

services:
  server:
    build:
      context: .
      dockerfile: development.Dockerfile
    ports:
      - "8081:8081"
    volumes:
      - .:/src
      - /src/node_modules
    networks:
      - dev-network
    environment:
      DB_HOSTNAME: pg-development
      DB_USER: root
      DB_PASSWORD: helloworld
      DB_PORT: 3306
      DB_NAME: test_dev
    depends_on:
      - pg-development
  pg-development:
    image: postgres
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: helloworld
      POSTGRES_DB: test_dev
    ports:
      - "3308:3306"
    volumes:
      - dbdata:/data/db
    networks:
      - dev-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U root -d test_dev"]
      interval: 10s
      timeout: 2s
      retries: 10
networks:
  dev-network:
    driver: bridge

volumes:
  dbdata:

Вот мой БД

import knex from "knex";

const connection = {
  host: process.env.DB_HOSTNAME,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  port: Number(process.env.DB_PORT),
  database: process.env.DB_USER,
};

const db = knex({
  client: "pg",
  connection,
  debug: true,
  pool: {
    min: 0,
    max: 50,
    afterCreate: function (conn, done) {
      conn.query('SET timezone="UTC";', function (err) {
        if (err) {
          done(err, conn);
        }
      });
    },
  },
});

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Причина, по которой это не сработало, заключается в том, что БД фактически запускалась на порту по умолчанию postgres, который равен 5432. Получается, что в docker -compose.yml вам необходимо добавить команду для изменения порта по умолчанию ,

pg-development:
    image: postgres
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: helloworld
      POSTGRES_DB: test_dev
    ports:
      - "3308:3306"
    volumes:
      - dbdata:/data/db
    networks:
      - dev-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U root -d test_dev"]
      interval: 10s
      timeout: 2s
      retries: 10
    command: -p 3306 // this fixes the issue
0 голосов
/ 20 апреля 2020

Это потому, что вы открываете неверный порт в контейнере pg-development:

https://docs.docker.com/compose/reference/port/

port [options] SERVICE PRIVATE_PORT

Порт, который вы открываете в база данных - это порт 3308, правильная конфигурация должна быть:

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