问题描述
我正在使用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
。
简短的答案:首先启动db
:docker-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"