簡體   English   中英

無法從Python連接到Docker Postgresql實例

[英]Failure to connect to Docker Postgresql instance from Python

我正在使用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?

>>> 

任何人都可以解釋為什么我無法使用Python連接到PostgreSQL - 即使我使用相同的參數/參數來啟用命令行上的成功連接(使用docker exec ?)。

[[附加信息]]

正如@Itvhillo所建議的那樣,我嘗試使用桌面應用程序連接到PG服務。 我使用以下命令運行docker服務:

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/"]

如果你在跑

$ 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沒有監聽,因此Dockerfile中出現了問題,你需要在Dockerfile上發布更多細節來診斷它。

似乎PostgreSQL由於某種原因無法綁定套接字來偵聽TCP連接。 它仍然會偵聽容器內的默認UNIX套接字,因此您可以通過docker exec -it $CONTAINER_NAME psql連接到它。

在postgresql.conf文件中將listen_addresses ='localhost'更改為listen_addresses ='*'然后嘗試通過psql連接

psql -h docker-ip -u username -w

嘗試隔離問題:在默認端口上運行clean 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端口被其他應用程序阻止或使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM