Python 3.x 连接到docker容器(aiohttp)内的PostreSQL时连接调用失败
我有一个简单的RESTAPI,它使用aiohttp、sqlalchemy和PostgreSQL 我曾经在docker容器中本地运行我的应用程序和postgresql。我使用localhost:5432连接到它 现在,我正试图将我的应用程序添加到docker compose,但从它连接到postgresql时遇到问题 这是我的撰写文件:Python 3.x 连接到docker容器(aiohttp)内的PostreSQL时连接调用失败,python-3.x,postgresql,docker,aiohttp,Python 3.x,Postgresql,Docker,Aiohttp,我有一个简单的RESTAPI,它使用aiohttp、sqlalchemy和PostgreSQL 我曾经在docker容器中本地运行我的应用程序和postgresql。我使用localhost:5432连接到它 现在,我正试图将我的应用程序添加到docker compose,但从它连接到postgresql时遇到问题 这是我的撰写文件: version: "3" services: db: image: postgres:9.4 container_name: db
version: "3"
services:
db:
image: postgres:9.4
container_name: db
restart: always
ports:
- "5432:5432"
command:
- "postgres"
- "-c"
- "listen_addresses=*"
environment:
POSTGRES_DB: library
POSTGRES_USER: admin
POSTGRES_PASSWORD: pass
innerio:
container_name: innerio
restart: 'on-failure'
build: .
volumes:
- .:/innerio
command: python3 api/models.py && python3 main.py
ports:
- "8080:8080"
depends_on:
- db
我的aiohttp运行部件:
if __name__ == '__main__':
loop = asyncio.get_event_loop()
app = loop.run_until_complete(main(loop))
run_app(app, host='0.0.0.0', port=8080)
以及保存数据库信息的字符串:
DB_ADDRESS = 'postgresql://admin:pass@db:5432/library'
使用上述设置,我得到以下错误:
innerio |引发操作错误,f'Connect调用失败{address}'
innerio | ConnectionRefusedError:[Errno 111]连接调用失败
'172.22.0.2',5432
我错过了什么?可能是您的应用程序在postgres实际侦听之前尝试连接到数据库。您在compose文件中设置了Dependes_on键,但这几乎没有任何作用:这意味着您的应用程序在postgres容器启动之前不会启动,但这与postgres是否已准备好为请求提供服务无关 理想情况下,您应该编写应用程序,使其在数据库连接失败时具有健壮性。这不仅可以解决启动问题,还允许您在应用程序处于活动状态时重新启动数据库容器 最简单的解决方案(只解决启动问题)是将数据库连接放入循环中,类似于:
while True:
try:
connect_to_database()
break
except ConnectionRefusedError:
log_error('database connection refused, retrying in 5 seconds...')
time.sleep(5)