(psycopg2.OperationalError)无法连接到服务器:连接被拒绝是服务器

我想连接两个docker容器,一个posgresql和另一个python瓶应用程序。 两者都正确链接,python应用程序中的所有连接variables直接取自postgres容器中通过链接显示的连接variables,与检查postgresql容器时发现的variables完全相同。 当我使用psql从连接string的确切参数即:

psql -p 5432 -h 172.17.0.2 -d mydb -U user 

在postgres容器中的数据库连接是成功的,所以我知道postgres通过指定的端口等正确通信。但是,当我试图通过具有相同的连接variables的瓶子连接到数据库,我得到这个错误:

Traceback(最近一次调用的最后一个):_do_get中的文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第1122行返回self._pool.get(wait,self._timeout)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/queue.py”,第145行,在get raise empty sqlalchemy.util.queue.Empty

在处理上述exception期间,发生了另一个exception:

回溯(最近的最后一次调用):文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,行2138,在_wrap_pool_connect返回fn()文件“/ usr / local / lib / python3.6 / site-packages / sqlalchemy / pool.py“,第328行,在unique_connection中返回_ConnectionFairy._checkout(self)File”/usr/local/lib/python3.6/site-packages/sqlalchemy/pool“。 py“,第766行,在_checkout fairy = _ConnectionRecord.checkout(pool)文件中”/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py“,第516行,在checkout中rec = pool._do_get ()文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第1138行,在_do_get self._dec_overflow()文件中“/usr/local/lib/python3.6/site -packages / sqlalchemy / util / langhelpers.py“,第60行, 退出 compat.reraise(exc_type,exc_value,exc_tb)文件”/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat。 py“,第187行,在reraise raise value文件”/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py“,第1135行,在_do_get中返回self._create_connectio n()文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第333行,在_create_connection中返回_ConnectionRecord(self)文件“/usr/local/lib/python3.6/ site-packages / sqlalchemy / pool.py“,第461行。 连接(first_connect_check = True)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,行651,在__connect连接= pool._invoke_creator(self)文件“/ usr / local / lib / python3.6 / site-packages / sqlalchemy / engine / strategies.py“,第105行,在connect中返回dialect.connect(* cargs,** cparams)文件”/usr/local/lib/python3.6/site -packages / sqlalchemy / engine / default.py“,第393行,在连接中返回self.dbapi.connect(* cargs,** cparams)文件”/usr/local/lib/python3.6/site-packages/psycopg2/连接conn = _connect(dsn,connection_factory = connection_factory,async = async)psycopg2.OperationalError:无法连接到服务器:连接被拒绝服务器运行在主机“172.17.0.2”并接受TCP /端口5432上的IP连接?

以上例外是以下例外的直接原因:

Traceback(最近一次调用的最后一个):在app = getModule(“/ var / www”,name).app中的文件“./wsgi.py”,第14行,getModule中的第5行的./wsgi.py文件返回imp.load_source(module,(“%s /%s.py”%(path,name)))文件“/usr/local/lib/python3.6/imp.py”,第172行,在load_source module = _load(spec)文件“/var/www/backend.py”,第3行,在import json,logging,db,os文件“/var/www/db.py”,第36行,在engine.connect() “/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第2082行,在连接中返回self._connection_cls(self,** kwargs)文件“/ usr / local / lib / python3.6 / site-packages / sqlalchemy / engine / base.py“,第90行,在init中如果连接不是的话无其他引擎引擎连接()文件”/usr/local/lib/python3.6/site-packages/ sqlalchemy / engine / base.py“,第2168行,在raw_connection self.pool.unique_connection,_connection)文件”/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py“,第2142行,在_wrap_pool_connect e,方言,自己)文件“/usr/local/lib/python3.6/site-pack 在/handle_dbapi_exception_noconnection exc_info文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py”中,第203行,在raise_from_cause中重新评估(“/ ages / sqlalchemy / engine / base.py”,第1456行)types(exception),exception,tb = exc_tb,cause = cause)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py”,第186行,在reraise raise value.with_traceback (tb)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,行2138,在_wrap_pool_connect返回fn()文件“/usr/local/lib/python3.6 /site-packages/sqlalchemy/pool.py“,第328行,在unique_connection中返回_ConnectionFairy._checkout(self)文件”/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py“,第766行,在_checkout fairy = _ConnectionRecord.checkout(pool)文件中“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第516行,在checkout中rec = pool._do_get()File“/ usr / local / lib / python3.6 / site-packages / sqlalchemy / pool.py“,行1138,在_do_get self._dec_overflow() /lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py“,第60行, 退出 compat.reraise(exc_type,exc_value,exc_tb)文件”/usr/local/lib/python3.6/site- packages / sqlalchemy / util / compat.py“,第187行,在_do_get中返回self,在reraise raise value文件中”/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py“,第1135行。 _create_connection()文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第333行,在_create_connection中返回_ConnectionRecord(self)文件“/usr/local/lib/python3.6/ site-packages / sqlalchemy / pool.py“,第461行。 连接(first_connect_check = True)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,行651,在__connect连接= pool._invoke_creator(self)文件“/ usr / local / lib / python3.6 / site-packages / sqlalchemy / engine / strategies.py“,第105行,在connect中返回dialect.connect(* cargs,** cparams)文件”/usr/local/lib/python3.6/site -packages / sqlalchemy / engine / default.py“,第393行,在连接中返回self.dbapi.connect(* cargs,** cparams)文件”/usr/local/lib/python3.6/site-packages/psycopg2/连接conn = _connect(dsn,connection_factory = connection_factory,async = async)sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)无法连接到服务器:连接被拒绝服务器运行在主机上“ __init .py” 172.17.0.2“并接受端口5432上的TCP / IP连接?

下面是我的烧瓶应用程序中导致exception的代码:

 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() 

当我login“引擎”时,我得到这个:

 Engine(postgresql://user:***@172.17.0.2:5432/mydb) 

它再次匹配在从我的主机到数据库成功的数据库连接中使用的参数。

我假设我的Python代码一定有什么问题,因为docker容器显示所有帐户正常工作。

任何帮助将不胜感激,谢谢。

所以我的代码实际上是确定的,发生了什么事是一个竞争条件,在数据库完全初始化和接受连接之前,python发送请求连接。