python - 通过 Flask docker 容器连接时,postgresql docker 容器拒绝连接
问题描述
我有连接到 PostgreSQL 的烧瓶应用程序,并且在单个安装中运行良好。但是,当我使用 docker 将其容器化到单独的容器中时,flask 应用程序无法连接到 PostgreSQL,并且收到的错误是 psycopg2.OperationalError: could not connect to server: Connection denied
下面提供的是 app.py 的代码
app = Flask(__name__)
app.config['basedir'] = os.path.abspath(os.path.dirname(__file__))
app.config['DEVELOPMENT'] = True
app.config['DEBUG'] = True
POSTGRES = {
'user': 'postgres',
'pw': 'postgres',
'db': 'postgres',
'host': 'localhost',
'port': '5432',
}
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s' % POSTGRES
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
api = Api(app)
from database.postgresql import db
db.init_app(app)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
该应用程序是使用应用程序服务器 uwsgi 部署的,下面提供的是 app.ini 文件内容
[uwsgi]
module=wsgi:app
wsgi-file = app.py
callable = app
socket = :8080
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true
错误堆栈如下
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 2336, in _wrap_pool_connect
return fn()
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 364, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 778, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 495, in checkout
rec = pool._do_get()
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 140, in _do_get
self._dec_overflow()
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.raise_(
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 137, in _do_get
return self._create_connection()
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 309, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 440, in __init__
self.__connect(first_connect_check=True)
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
pool.logger.debug("Error on connect(): %s", e)
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.raise_(
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 656, in __connect
connection = pool._invoke_creator(self)
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 493, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 127, 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 "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
解决方案
app.py 中的 postgres 配置有问题。
您不是在尝试连接到您的 postgres 容器,而是您的 Flask 容器的本地主机。您需要指定 postgres 容器的地址。然后它将完美地工作。
您可以在此处阅读有关 Docker 中的网络通信如何工作的更多信息。
推荐阅读
- java - 如何让这个程序接受 n 个测试用例?
- mysql - 无法使用 PHPMyAdmin 导入数据库
- html - 有没有办法为自动换行设置断点?
- javascript - 每次加载时按内容设置 iframe 高度
- c# - 使用接口继承进行强制转换
- angular - Angular 7 - 如何在某些响应状态代码上重试 http 请求?
- sql - 在 SQL Postgres 中迭代 group by
- c# - 我可以在普通 VM 上部署我的 Azure 功能吗?
- python - Keras 模型检查点保存期间出错:'OSError:无法创建文件。没有权限'
- angular - android设备上的iframe全屏问题