尝试创建数据库迁移时获取“无法将主机名“ db”转换为地址”

问题描述

我正在使用FastAPI和postgresql构建一个简单的python API后端。当我尝试构建数据库迁移文件(使用Alembic)时,会发生此错误

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

在这个问题上进行了很多搜索,这似乎是因为我的docker配置,但我无法弄清楚。这是我的docker-compose代码

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的设置相同)感到怀疑,它工作正常并且没有任何类似的问题。

我应该检查并更改以解决此问题?

P.S:我是Docker的初学者。

解决方法

这是正在发生的事情:

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

简短的答案:首先启动dbdocker-compose up -d db,然后启动网络:docker-compose up web或您正在运行的任何版本。

现在,答案很长。如果您回答简短,那没关系,但是如果您问我,那将很麻烦。您可以尝试将version更改为2.x,例如2.4,然后将depends_on添加到web,例如:

version: '2.4'
services:
  web:
    ...
    depends_on:
      - db
  db:
    image: ...
    ...

如果您仅运行docker-compose up ...,则docker将首先启动db

现在,您可能会遇到另一个问题:postgres可能尚未准备好接收连接。在这种情况下,您将不得不等待它准备就绪。您可以通过在错误时重试数据库连接来实现此目的(我不记得确切的错误,您必须检查文档)或使用类似pg_isready的方法。假设这是一个开发环境,您可以通过安装postgresql-client并将cmd更改为以下内容将其添加到Dockerfile中:

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"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...