web-dev-qa-db-ger.com

Keine Verbindung zur Docker Postgresql-Instanz über Python

Ich verwende Docker, um eine PostgreSQL-Bereitstellung zu "containerisieren". Ich kann den Container hochfahren und über die Befehlszeile eine Verbindung zu PostgreSQL herstellen, wie unten gezeigt:

[email protected]:~/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

[email protected]:~/Projects/skunkworks$ CONTAINER_ID=dc176901052a
[email protected]:~/Projects/skunkworks$ IP=$(docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' $CONTAINER_ID)

[email protected]:~/Projects/skunkworks$ echo $IP
172.17.0.2


[email protected]:~/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#

Verbindung mit Python wird jetzt versucht:

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?

>>> 

Kann jemand erklären, warum ich keine Verbindung zu PostgreSQL mit Python herstellen kann - obwohl ich dieselben Argumente/Parameter verwende, die eine erfolgreiche Verbindung über die Befehlszeile ermöglichen (mithilfe von docker exec?).

[[Zusätzliche Information]]

Wie von @Itvhillo vorgeschlagen, habe ich versucht, eine Desktop-Anwendung zu verwenden, um eine Verbindung zum PG-Dienst herzustellen. Ich führe den Andockdienst mit dem folgenden Befehl aus:

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

Ich verwende Db Visualizer , um eine Verbindung zur Datenbank herzustellen, und ich habe den Hostnamen auf 'localhost' gesetzt. Ich kann den Port erfolgreich pingen, erhalte jedoch immer noch eine Fehlermeldung, wenn ich versuche, eine Verbindung zur Datenbank herzustellen (möglicherweise in Zusammenhang mit Berechtigungen stehender Fehler):

An error occurred while establishing the connection:

Long Message:
The connection attempt failed.

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

Dies ist übrigens das Ende der Ausgabe für die PG-Service-Instanz:

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

[[Zusatzinfo2]]

Hier ist das hintere Ende meiner 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/"]
13

Wenn du rennst

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

Dann sollten Sie sich vom Host aus mit localhost:5432 verbinden können. Der einfachste Weg, um zu überprüfen, ob auf Port 5432 etwas überwacht wird, ist netcat. Im Erfolgsfall sollten Sie:

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

In diesem Fall sollten Sie eine Verbindung herstellen können mit:

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

Wenn Sie dagegen etwas bekommen:

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

Dann bedeutet es, dass PostgreSQL nicht zuhört und daher in Ihrer Docker-Datei etwas nicht stimmt. Sie müssen weitere Details zu Ihrer Docker-Datei veröffentlichen, um sie zu diagnostizieren.

7

Es scheint, dass PostgreSQL aus irgendeinem Grund Socket nicht an TCP -Verbindungen binden konnte. Der UNIX-Standard-Socket innerhalb des Containers wird jedoch weiterhin überwacht, sodass Sie über docker exec -it $CONTAINER_NAME psql eine Verbindung herstellen können.

3
ei-grad

Ändern Sie in der Datei postgresql.conf Listen_addresses = 'localhost' in listen_addresses = '*' Versuchen Sie dann, eine Verbindung über psql herzustellen

psql -h docker-ip -u Benutzername -w

0
Lennin

Versuchen Sie, das Problem zu isolieren: Führen Sie eine saubere Postgres-Instanz ohne Erweiterungen für den Standardport aus:

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

Und versuche dich damit zu verbinden. Wenn Sie können, müssen Sie Ihre Dockerfile entsprechend überprüfen: Entfernen Sie einfach alles von dort und fügen Sie nach und nach neue Elemente hinzu. Wenn dies nicht der Fall ist, versuchen Sie es an einem anderen Port auszuführen:

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

Und versuche dich zu verbinden. Wenn es diesmal funktioniert, wird das Problem der Netzwerkkonfiguration auf dem Host-Computer, der 5432-Port ist irgendwie blockiert oder wird von anderen Apps verwendet.

0
Moisei