Подключение к postgres поднятому в докере

docker-compose.yml:

version: "3.9"
services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: "db"
      POSTGRES_USER: "user"
      POSTGRES_PASSWORD: "password"
    ports:
      - "5432:5432"

запустим:

docker-compose up

Я думал, что после проделанных манипуляций я смогу подключиться к postgress указав в качестве хоста localhost. (Под подключением я имею ввиду подключение не заходя в докер контейнер) Однако такой способ не сработает, при подключении будет ошибка

connection to server at "localhost" (::1), port 5432 failed: FATAL:  role "user" does not exist

Погуглив я нашел правильный способ подключения - не надо использовать localhost, вместо этого надо использовать адрес, полученный с помощью команды

ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\  -f2 | head -1

Хоть подключиться у меня и получилось, осталось непонимание ситуации. Почему не работает подключение по localhost? Почему работает второй описанный мной способ? В чем вообще смысл команды ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1?

У меня macos


Ответы (1 шт):

Автор решения: Maksim Alekseev

Что бы подключиться к базе созданной в docker-e из вне, нужно прокинуть порт в сервиce docker-compose:

ports:
  - "13000:5432"

Теперь будет доступно подключение к базе внутри контейнера - localhost:13000

Test:

import psycopg2

connection = psycopg2.connect(
    dbname='db',
    user='user',
    password='password',
    host='localhost',
    port=13000
)

cursor = connection.cursor()

cursor.execute('SELECT datname FROM pg_database;')
print(*cursor.fetchall())

cursor.close()
connection.close()

Output:

('postgres',) ('db',) ('template1',) ('template0',)
→ Ссылка