Postgresql 获得';无法翻译主机名“;db";解决';尝试创建数据库迁移时

Postgresql 获得';无法翻译主机名“;db";解决';尝试创建数据库迁移时,postgresql,docker,sqlalchemy,alembic,fastapi,Postgresql,Docker,Sqlalchemy,Alembic,Fastapi,我正在使用FastAPI和postgresql构建一个简单的python api后端。当我尝试构建数据库迁移文件(使用Alembic)时,出现以下错误: sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)无法将主机名“db”转换为地址:名称或服务未知 由于我搜索了很多关于这个问题的信息,这似乎是因为我的docker配置,但我无法找到它。这是我的docker编写代码: version: '3.7' services: web

我正在使用FastAPI和postgresql构建一个简单的python api后端。当我尝试构建数据库迁移文件(使用Alembic)时,出现以下错误:

sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)无法将主机名“db”转换为地址:名称或服务未知

由于我搜索了很多关于这个问题的信息,这似乎是因为我的docker配置,但我无法找到它。这是我的docker编写代码:

version: '3.7'

services:
  web:
    build: ./src
    command: sh -c "alembic upgrade head && uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000"
    volumes:
      - ./src/:/usr/src/app/
    ports:
      - 8002:8000
    environment:
      - DATABASE_URL=postgresql://user:pass@db/my_db
  db:
    image: postgres:12.1-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=my_db
      - POSTGRES_HOST_AUTH_METHOD=trust
    ports:
      - 5432:5432

volumes:
  postgres_data:
我还怀疑我的另一个项目在本地机器中使用docker(与FastAPI、postgres和docker的设置相同),它工作正常,没有任何类似的问题

我应该检查和更改什么来解决问题


附言:我是docker的初学者。

下面是发生的事情:

您的
web
容器正在尝试连接到
db
,但
db
尚未启动,简单地说
web
无法“查看”
db

简短的回答是:首先启动
db
docker compose up-d db
,然后启动web:
docker compose up web
或您正在运行的任何程序

现在,答案很长。如果你继续回答这个简短的问题,没关系,但是如果你问我的话,这会很麻烦。您可以尝试将
版本更改为
2.x
例如
2.4
,并将
依赖于
添加到
web
,例如:

version: '2.4'
services:
  web:
    ...
    depends_on:
      - db
  db:
    image: ...
    ...
如果您只是运行
docker compose up…
,docker将首先启动
db

现在,您可能遇到另一个问题:postgres可能还没有准备好接收连接。在这种情况下,您必须等待它准备好。您可以通过在出现错误时重试db连接(我不记得确切的错误,您必须检查文档)或使用类似于
pg_isready
的方法来实现这一点。假设这是一个开发环境,您可以通过安装
postgresql client
并将cmd更改为:

command: >
  sh -c "
  until pg_isready -q -h db; do sleep 1; done
  &&
  alembic upgrade head
  &&
  uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000"

你是怎么运行这个的?
docker compose-up-build
@snahor