Не удалось подключиться к экземпляру Docker Postgresql из Python

164
12

Я использую Docker для "контейнеризации" развертывания PostgreSQL. Я могу развернуть контейнер и подключиться к PostgreSQL через командную строку, как показано ниже:

minime2@CEBERUS:~/Projects/skunkworks$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc176901052a df:pg "docker-entrypoint..." About an hour ago Up About an hour 5432/tcp vigilant_agnesi

minime2@CEBERUS:~/Projects/skunkworks$ CONTAINER_ID=dc176901052a
minime2@CEBERUS:~/Projects/skunkworks$ IP=$(docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' $CONTAINER_ID)

minime2@CEBERUS:~/Projects/skunkworks$ echo $IP
172.17.0.2

minime2@CEBERUS:~/Projects/skunkworks$ docker exec -it vigilant_agnesi psql -U postgres -W cookiebox
Passwod for user postgres:
psql (9.6.5)
Type "help" for help

cookiebox#

Теперь попытка соединения с Python:
Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> conn = psycopg2.connect("dbname='cookiebox' user='postgres' host='172.17.0.2' password='nunyabiznes'") Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/minime2/Projects/skunkworks/archivers/env/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host "172.17.0.2" and accepting
TCP/IP connections on port 5432?

>>>

Может кто-нибудь объяснить, почему я не могу подключиться к PostgreSQL с помощью Python - хотя я использую те же аргументы/параметры, которые позволяют успешно подключиться в командной строке (используя docker exec?).

[[Дополнительная информация]]

Как предложил @Itvhillo, я попытался использовать настольное приложение для подключения к службе PG. Я запускаю службу докеров, используя следующую команду:

docker run -i -p 5432:5432 --name $CONTAINER_NAME $DOCKER_IMAGE

Я использую Db Visualizer для подключения к базе данных, и я установил имя хоста для "localhost". Я могу успешно выполнить ping порт, но все равно получаю сообщение об ошибке при попытке подключения к базе данных (возможная ошибка, связанная с разрешениями):

An error occurred while establishing the connection:

Long Message:
The connection attempt failed.

Details:
   Type: org.postgresql.util.PSQLException
   SQL State: 08001

Кстати, это хвост выхода для экземпляра службы PG:

PostgreSQL init process complete; ready for start up.

LOG: could not bind IPv6 socket: Cannot assign requested address
HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
LOG: database system was shut down at 2018-01-30 16:21:59 UTC
LOG: MultiXact member wraparound protections are now enabled
LOG: database system is ready to accept connections
LOG: autovacuum launcher started

[[Дополнительная информация2]]

Вот хвост моего Dockerfile:

# modified target locations (checked by login onto Docker container)
# show hba_file;
# show config_file;

#################################################################################
# From here: https://docs.docker.com/engine/examples/postgresql_service/
# Adjust PostgreSQL configuration so that remote connections to the
# database are possible.
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf

# And add ''listen_addresses'' to ''/var/lib/postgresql/data/postgresql.conf''
RUN echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf
#################################################################################

EXPOSE 5432

# Add VOLUMEs to allow backup of config, logs and databases
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql", "/usr/lib/postgresql/"]

спросил(а) 2021-01-25T16:47:44+03:00 4 месяца, 2 недели назад
1
Решение
126

Если вы работаете

$ docker run -i -p 5432:5432 --name $CONTAINER_NAME $DOCKER_IMAGE

Затем вы сможете подключиться к localhost:5432 от хоста. Самый простой способ проверить, что-то прослушивает порт 5432, - это использование netcat. В случае успеха вы должны получить:

$ nc -zv localhost 5432 
Connection to localhost 5432 port [tcp/postgresql] succeeded!

В этом случае вы сможете подключиться, используя:

>>> psycopg2.connect("dbname='cookiebox' user='postgres' host='localhost' password='nunyabiznes'") 

Если, с другой стороны, вы получаете что-то вроде:

$ nc -zv localhost 5432 
nc: connect to localhost port 5432 (tcp) failed: Connection refused

Тогда это означает, что PostgreSQL не прослушивает, и, следовательно, что-то не так в вашем файле Docker, и вам нужно будет опубликовать более подробную информацию о вашем файле Docker для его диагностики.

ответил(а) 2021-01-25T16:47:44+03:00 4 месяца, 2 недели назад
89

Похоже, что PostgreSQL по какой-то причине не смог связать сокет для прослушивания TCP-соединений. Он по-прежнему прослушивает сокет UNIX по умолчанию в контейнере, поэтому вы можете подключиться к нему через docker exec -it $CONTAINER_NAME psql.

ответил(а) 2021-01-25T16:47:44+03:00 4 месяца, 2 недели назад
45

Попробуйте изолировать проблему: запустите чистый экземпляр postgres без каких-либо расширений на порту по умолчанию:

docker run  -d --name tst-postgres-01 -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres:9.6

И попробуйте подключиться к нему. Если вы можете, то вам необходимо соответствующим образом просмотреть свой файл Dockerfile: просто удалите все, а затем добавьте новые вещи по одному. В противном случае, если он не подключается, попробуйте запустить его на другом порту:

docker run  -d --name tst-postgres-01 -p 45432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres:9.6

И попробуйте подключиться. Если он работает в этот раз, то проблема с настройкой вашей сети на хост-компьютере, как-то 5432-порт заблокирована или используется другим приложением.

ответил(а) 2021-01-25T16:47:44+03:00 4 месяца, 2 недели назад
45

В файле postgresql.conf измените listen_addresses = 'localhost' на listen_addresses = '*' Затем попробуйте подключиться через psql

psql -h docker-ip -u имя пользователя -w

ответил(а) 2021-01-25T16:47:44+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема