Python 3.x 连接到docker容器(aiohttp)内的PostreSQL时连接调用失败

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

我有一个简单的RESTAPI,它使用aiohttp、sqlalchemy和PostgreSQL

我曾经在docker容器中本地运行我的应用程序和postgresql。我使用localhost:5432连接到它

现在,我正试图将我的应用程序添加到docker compose,但从它连接到postgresql时遇到问题

这是我的撰写文件:

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)