(psycopg2.OperationalError) 无法连接到服务器:连接被拒绝是服务器
(psycopg2.OperationalError) could not connect to server: Connection refused Is the server
我正在尝试连接两个 docker 容器,一个是 posgresql,另一个是 python flask 应用程序。两者都正确链接,python 应用程序中的所有连接变量都直接取自通过链接公开的 postgres 容器中的变量,并且与检查 postgresql 容器时发现的变量相同。当我将 psql 与连接字符串中的确切参数一起使用时,即:
psql -p 5432 -h 172.17.0.2 -d mydb -U user
连接到 postgres 容器中的数据库成功,所以我知道 postgres 通过指定的端口等正确通信。但是,当我尝试使用相同的连接变量通过 flask 连接到数据库时,我得到了这个错误:
Traceback (most recent call last): File
"/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line
1122, in _do_get
return self._pool.get(wait, self._timeout) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/queue.py",
line 145, in get
raise Empty sqlalchemy.util.queue.Empty
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File
"/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
line 2138, in _wrap_pool_connect
return fn() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 328,
in unique_connection
return _ConnectionFairy._checkout(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 766,
in _checkout
fairy = _ConnectionRecord.checkout(pool) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516,
in checkout
rec = pool._do_get() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line
1138, in _do_get
self._dec_overflow() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py",
line 60, in exit
compat.reraise(exc_type, exc_value, exc_tb) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py",
line 187, in reraise
raise value File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line
1135, in _do_get
return self._create_connection() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 333,
in _create_connection
return _ConnectionRecord(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 461,
in init
self.connect(first_connect_check=True) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 651,
in __connect
connection = pool._invoke_creator(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py",
line 105, in connect
return dialect.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py",
line 393, in connect
return self.dbapi.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/psycopg2/__init.py", line
164, in connect
conn = _connect(dsn, connection_factory=connection_factory, async=async) 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?
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "./wsgi.py", line 14, in
app = getModule("/var/www", name).app File "./wsgi.py", line 5, in getModule
return imp.load_source(module, ("%s/%s.py" % (path, name))) File "/usr/local/lib/python3.6/imp.py", line 172, in load_source
module = _load(spec) File "/var/www/backend.py", line 3, in
import json, logging, db, os File "/var/www/db.py", line 36, in
engine.connect() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
line 2082, in connect
return self._connection_cls(self, **kwargs) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
line 90, in init
if connection is not None else engine.raw_connection() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
line 2168, in raw_connection
self.pool.unique_connection, _connection) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
line 2142, in _wrap_pool_connect
e, dialect, self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
line 1456, in _handle_dbapi_exception_noconnection
exc_info File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py",
line 203, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py",
line 186, in reraise
raise value.with_traceback(tb) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py",
line 2138, in _wrap_pool_connect
return fn() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 328,
in unique_connection
return _ConnectionFairy._checkout(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 766,
in _checkout
fairy = _ConnectionRecord.checkout(pool) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516,
in checkout
rec = pool._do_get() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line
1138, in _do_get
self._dec_overflow() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py",
line 60, in exit
compat.reraise(exc_type, exc_value, exc_tb) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py",
line 187, in reraise
raise value File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line
1135, in _do_get
return self._create_connection() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 333,
in _create_connection
return _ConnectionRecord(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 461,
in init
self.connect(first_connect_check=True) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 651,
in __connect
connection = pool._invoke_creator(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py",
line 105, in connect
return dialect.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py",
line 393, in connect
return self.dbapi.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/psycopg2/__init.py", line
164, in connect
conn = _connect(dsn, connection_factory=connection_factory, async=async) sqlalchemy.exc.OperationalError:
(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?
下面是我的 Flask 应用程序中导致异常的代码:
import os, logging, json
from datetime import datetime
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import BigInteger, Integer, String, DateTime, Column, Table, ForeignKey, create_engine
from sqlalchemy.dialects.postgresql import JSON
from sqlalchemy.orm import scoped_session, sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
user = os.environ.get('DB_USER','user')
password = os.environ.get('DB_PASSWORD','password')
address = os.environ.get('DB_ADDR','0.0.0.0')
port = os.environ.get('DB_PORT','')
name = os.environ.get('DB_NAME','')
db_url = "postgresql://%s:%s@%s:%s/%s" % (user, password, address, port, name)
engine = create_engine(db_url, convert_unicode=True, client_encoding='utf8')
print (engine)
engine.connect()
当我记录 "engine" 我得到这个:
Engine(postgresql://user:***@172.17.0.2:5432/mydb)
这再次与我主机上的数据库成功连接数据库时使用的参数相匹配。
我假设我的 python 代码一定有问题,因为所有帐户的 docker 容器都正常工作。
任何帮助将不胜感激,谢谢。
所以我的代码实际上没问题,发生的是竞争条件,其中 python 在数据库完全初始化并接受连接之前发送连接请求。
我正在尝试连接两个 docker 容器,一个是 posgresql,另一个是 python flask 应用程序。两者都正确链接,python 应用程序中的所有连接变量都直接取自通过链接公开的 postgres 容器中的变量,并且与检查 postgresql 容器时发现的变量相同。当我将 psql 与连接字符串中的确切参数一起使用时,即:
psql -p 5432 -h 172.17.0.2 -d mydb -U user
连接到 postgres 容器中的数据库成功,所以我知道 postgres 通过指定的端口等正确通信。但是,当我尝试使用相同的连接变量通过 flask 连接到数据库时,我得到了这个错误:
Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1122, in _do_get return self._pool.get(wait, self._timeout) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/queue.py", line 145, in get raise Empty sqlalchemy.util.queue.Empty
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2138, in _wrap_pool_connect return fn() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 328, in unique_connection return _ConnectionFairy._checkout(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 766, in _checkout fairy = _ConnectionRecord.checkout(pool) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516, in checkout rec = pool._do_get() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1138, in _do_get self._dec_overflow() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 60, in exit compat.reraise(exc_type, exc_value, exc_tb) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise raise value File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1135, in _do_get return self._create_connection() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 333, in _create_connection return _ConnectionRecord(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 461, in init self.connect(first_connect_check=True) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 651, in __connect connection = pool._invoke_creator(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect return dialect.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 393, in connect return self.dbapi.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/psycopg2/__init.py", line 164, in connect conn = _connect(dsn, connection_factory=connection_factory, async=async) 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?
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "./wsgi.py", line 14, in app = getModule("/var/www", name).app File "./wsgi.py", line 5, in getModule return imp.load_source(module, ("%s/%s.py" % (path, name))) File "/usr/local/lib/python3.6/imp.py", line 172, in load_source module = _load(spec) File "/var/www/backend.py", line 3, in import json, logging, db, os File "/var/www/db.py", line 36, in engine.connect() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2082, in connect return self._connection_cls(self, **kwargs) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 90, in init if connection is not None else engine.raw_connection() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2168, in raw_connection self.pool.unique_connection, _connection) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2142, in _wrap_pool_connect e, dialect, self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1456, in _handle_dbapi_exception_noconnection exc_info File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 186, in reraise raise value.with_traceback(tb) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2138, in _wrap_pool_connect return fn() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 328, in unique_connection return _ConnectionFairy._checkout(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 766, in _checkout fairy = _ConnectionRecord.checkout(pool) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516, in checkout rec = pool._do_get() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1138, in _do_get self._dec_overflow() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 60, in exit compat.reraise(exc_type, exc_value, exc_tb) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise raise value File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1135, in _do_get return self._create_connection() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 333, in _create_connection return _ConnectionRecord(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 461, in init self.connect(first_connect_check=True) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 651, in __connect connection = pool._invoke_creator(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect return dialect.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 393, in connect return self.dbapi.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site-packages/psycopg2/__init.py", line 164, in connect conn = _connect(dsn, connection_factory=connection_factory, async=async) sqlalchemy.exc.OperationalError: (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?
下面是我的 Flask 应用程序中导致异常的代码:
import os, logging, json
from datetime import datetime
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import BigInteger, Integer, String, DateTime, Column, Table, ForeignKey, create_engine
from sqlalchemy.dialects.postgresql import JSON
from sqlalchemy.orm import scoped_session, sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
user = os.environ.get('DB_USER','user')
password = os.environ.get('DB_PASSWORD','password')
address = os.environ.get('DB_ADDR','0.0.0.0')
port = os.environ.get('DB_PORT','')
name = os.environ.get('DB_NAME','')
db_url = "postgresql://%s:%s@%s:%s/%s" % (user, password, address, port, name)
engine = create_engine(db_url, convert_unicode=True, client_encoding='utf8')
print (engine)
engine.connect()
当我记录 "engine" 我得到这个:
Engine(postgresql://user:***@172.17.0.2:5432/mydb)
这再次与我主机上的数据库成功连接数据库时使用的参数相匹配。
我假设我的 python 代码一定有问题,因为所有帐户的 docker 容器都正常工作。
任何帮助将不胜感激,谢谢。
所以我的代码实际上没问题,发生的是竞争条件,其中 python 在数据库完全初始化并接受连接之前发送连接请求。