【问题标题】:Unable to connect postgres to fastapi in docker-compose无法在 docker-compose 中将 postgres 连接到 fastapi
【发布时间】:2024-12-25 01:05:02
【问题描述】:

我创建了 docker-compose 文件。

version: '3'
services:
  fastapi_cont:
    build: 'api_file/'
    ports:
      - 8000:8000
    depends_on:
      - postg
    networks:
      - quest_network
    container_name: fastapi_cont
  postg:
    image: postgres:latest
    ports:
      - 5432:5432
    env_file:
      - api_file/utils/db.env
    networks:
      - quest_network
    container_name: postg

  streamlit_cont:
    build: 'streamlit/'
    depends_on:
      - postg
      - fastapi_cont
    ports:
      - 8502:8502
    networks:
      - quest_network

networks: 
  quest_network:
    driver: bridge

运行时docker-compose up --build

当主机名被命名为 Postgres 容器名时出现此错误::

Pulling postg (postgres:latest)...
latest: Pulling from library/postgres
e5ae68f74026: Pull complete
7b8fcc7e1ad0: Pull complete
7527d03e2f77: Pull complete
80e55689f4d0: Pull complete
8a79eb6d69c9: Pull complete
397705f2d093: Pull complete
de36ec4eb0a5: Pull complete
08d878a022c1: Pull complete
7677029670ff: Pull complete
1d24b3d9557e: Pull complete
e085b018338c: Pull complete
063b09ff12e9: Pull complete
a39fee215a44: Pull complete
Digest: sha256:f76241d07218561e3d1a334eae6a5bf63c70b49f35ffecb7f020448e30e37390
Status: Downloaded newer image for postgres:latest
Building fastapi_cont
[+] Building 14.6s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                            0.0s 
 => => transferring dockerfile: 32B                                                                                                                             0.0s 
 => [internal] load .dockerignore                                                                                                                               0.0s 
 => => transferring context: 34B                                                                                                                                0.0s 
 => [internal] load metadata for docker.io/library/python:3.8.12                                                                                                3.1s 
 => [1/5] FROM docker.io/library/python:3.8.12@sha256:881e0df149c29af8b29a973a9e80814dae6cddf123fe38a0bcac71864c85fb8a                                          0.0s 
 => [internal] load build context                                                                                                                               0.0s 
 => => transferring context: 1.69kB                                                                                                                             0.0s 
 => CACHED [2/5] WORKDIR api_file                                                                                                                               0.0s 
 => CACHED [3/5] COPY . ./api_file/                                                                                                                             0.0s 
 => CACHED [4/5] RUN pip install -r ./api_file/fastapi_requriements.txt                                                                                         0.0s 
 => ERROR [5/5] RUN python ./api_file/connection.py                                                                                                            11.4s 
------
 > [5/5] RUN python ./api_file/connection.py:
#9 10.81 Traceback (most recent call last):
#9 10.81   File "./api_file/connection.py", line 9, in <module>
#9 10.81     connector=psycopg2.connect(dbname=database_settings.DATABASE,
#9 10.81   File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 122, in connect
#9 10.81     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
#9 10.81 psycopg2.OperationalError: could not translate host name "postg" to address: Temporary failure in name resolution
#9 10.81
------
executor failed running [/bin/sh -c python ./api_file/connection.py]: exit code: 1
ERROR: Service 'fastapi_cont' failed to build : Build failed

当我将主机名更改为 localhost 时,出现以下错误::

9 1.033 Traceback (most recent call last):
#9 1.033   File "./api_file/connection.py", line 9, in <module>
#9 1.033     connector=psycopg2.connect(dbname=database_settings.DATABASE,
#9 1.033   File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 122, in connect
#9 1.033     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
#9 1.033 psycopg2.OperationalError: could not connect to server: Connection refused
#9 1.033        Is the server running on host "localhost" (127.0.0.1) and accepting
#9 1.033        TCP/IP connections on port 5432?
#9 1.033 could not connect to server: Cannot assign requested address
#9 1.033        Is the server running on host "localhost" (::1) and accepting
#9 1.033        TCP/IP connections on port 5432?
#9 1.033 

即使删除 docker-compose 并单独运行 Postgres docker,在它启动后,当我运行 fastapi docker 文件时。我遇到了同样的错误。

fastapi 的 dockerfile 是

FROM python:3.8.12
WORKDIR api_file
COPY . ./api_file/
RUN pip install -r ./api_file/fastapi_requriements.txt
RUN python ./api_file/connection.py
CMD uvicorn api_file.main:app

connection.py 的起始行是

import psycopg2
from utils.config_reader import database_settings
from psycopg2.extras import DictCursor
import time
from utils.y_labels import y_columns
from psycopg2 import sql

connector=None
connector=psycopg2.connect(dbname=database_settings.DATABASE,
                            user=database_settings.DATABASE_USER,
                            password=database_settings.DATABASE_PASSWORD,
                            host=database_settings.HOSTNAME,
                            port=database_settings.PORT,
                            cursor_factory=DictCursor)

cursor=connector.cursor()

#while True:
#    try:
#        connector=psycopg2.connect(dbname=database_settings.DATABASE,
#                                    user=database_settings.DATABASE_USER,
#                                    password=database_settings.DATABASE_PASSWORD,
#                                    host=database_settings.HOSTNAME,
#                                    port=database_settings.PORT,
#                                    cursor_factory=DictCursor)
#
#        cursor=connector.cursor()
#        print("WE MADE A SUCCESSFUL CONNECTION TO THE DATABASE")
#        break
#    except Exception as error:
#        print("CONNECTION FAILED")
#        print("ERROR : ",error)
#        time.sleep(2)

我还尝试将连接代码保留在 while 块中。以防万一数据库没有启动,然后它会再次运行。但是,它继续运行。所以,我现在评论了它。

【问题讨论】:

  • 您使用的确切数据库主机名和端口是什么?
  • 主机名是 postg(这是我保留的 postgres 容器名称),端口是 5432。

标签: postgresql docker docker-compose fastapi


【解决方案1】:

您在显示的第一个日志中使用了什么命令?

为了调试,我会先去掉所有 container_name/networks 的东西,这些都是多余的,可能会配置错误,记住你在这里使用的是 compose file v3.0(最近是 v3.8)。

使用来自fastapi_contpostg 主机名将立即生效。

【讨论】:

  • 谢谢,我删除了我的 .env 文件、docker 文件并重新创建了它们。现在他们正在工作。我之前一定有一些错误的配置。
最近更新 更多