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#
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/"]
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.
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.
Ä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
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.