首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL无法使用docker-compose通过SQLalchemy连接到fastapi应用程序

PostgreSQL无法使用docker-compose通过SQLalchemy连接到fastapi应用程序
EN

Stack Overflow用户
提问于 2019-11-04 07:40:25
回答 1查看 1.7K关注 0票数 0
代码语言:javascript
运行
复制
test-api_1  | sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
test-api_1  |   Is the server running on host "0.0.0.0" and accepting
test-api_1  |   TCP/IP connections on port 5432?
test-api_1  | 
test-api_1  | (Background on this error at: http://sqlalche.me/e/e3q8)
partnerup-api_test-api_1 exited with code 1

这就是我得到的错误-它相对模糊,并且没有提供更多的信息。

从docker-compose cli中,我得到了以下内容:

代码语言:javascript
运行
复制
my_postgres | 2019-11-03 23:05:21.746 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
my_postgres | 2019-11-03 23:05:21.746 UTC [1] LOG:  listening on IPv6 address "::", port 5432
my_postgres | 2019-11-03 23:05:21.758 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
my_postgres | 2019-11-03 23:05:21.817 UTC [51] LOG:  database system was shut down at 2019-11-03 23:05:21 UTC
my_postgres | 2019-11-03 23:05:21.847 UTC [1] LOG:  database system is ready to accept connections

这很令人困惑,因为它似乎在侦听,但基础api应用程序无法通过sql炼金术识别。

我尝试导航到postgres.conf,但发现listen_adress = '*‘

除此之外,我不知道什么是问题所在。

database.py

代码语言:javascript
运行
复制
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


SQLALCHEMY_TRACK_MODIFICATIONS = False
## from sql alchemy docs --- format: postgresql://<user>:<password>@<host>:<port>/<database>
SQLALCHEMY_DATABASE_URI = 'postgresql://postgres:dbpw@0.0.0.0:5432/partnerup'
engine = create_engine(SQLALCHEMY_DATABASE_URI)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

docker-compose.yml

代码语言:javascript
运行
复制
version: '3' #docker-compose version
services:       #containers in the network
  test-api:
    build: .
    ports:
      - 5000:5000 #port to go to to get a local version of the app
    volumes:
      - ./apps/api/app:/app
    working_dir: /app
    depends_on: 
      - db
    command:
      ['uvicorn', 'main:app', '--host', '127.0.0.1', '--port', '5000']
      #may integrate later
  db:
    image: "postgres:11"
    container_name: "my_postgres"
    restart: always 
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'dbpw'
      POSTGRES_DATABASE: 'partnerup'
      POSTGRES_HOST: 'localhost'
      POSTGRES_PORT: '5432'
    volumes:
          # this command will create database as described in init file 
     # - .:/docker-entrypoint-initdb.d/       
      - db_volume:/var/lib/postgresql
volumes:
  db_volume: {}

我希望我能够验证连接,但我一直收到令人讨厌的错误消息。

EN

Stack Overflow用户

回答已采纳

发布于 2019-12-02 01:39:04

当使用docker-compose并尝试连接到数据库容器时,您需要连接到服务,而不是在我的实例中指定:

代码语言:javascript
运行
复制
0.0.0.0:5432 

在……里面

代码语言:javascript
运行
复制
SQLALCHEMY_DATABASE_URI = 'postgresql://postgres:dbpw@0.0.0.0:5432/partnerup'

相反,它应该像这样命名服务:

代码语言:javascript
运行
复制
SQLALCHEMY_DATABASE_URI = 'postgresql://postgres:dbpw@db/partnerup'

其中db是服务容器的名称。

还有另一个可能面临的问题:

如果数据库容器未完成启动,而api服务尝试连接,则还会遇到连接错误。解决此问题的一种方法是在bash代码中添加某种等待脚本,这可能更可取。

另一种不太干净的方法是利用docker-compose重启功能,如下所示。

在您的api服务中只需添加

代码语言:javascript
运行
复制
restart: on-failure

它会告诉您api服务一直重启,直到成功。在我看来,这是一种让数据库服务有启动时间的丑陋方式。

*注意:

代码语言:javascript
运行
复制
depends_on: - db

在test-api服务中,确实会影响服务的启动顺序,但是不会检查db服务的运行状况以确保它已经启动。在某些情况下,这可能就是您需要做的全部工作。在我的例子中,这是不够的,因为db容器需要一点时间。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58685601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档