Python 应用程序如何使用 Docker-compose 找到 Postgres 数据库

How Python app can find a Postgres Database using Docker-compose

我在将 Docker Python 应用程序连接到 Docker Postgres 数据库时遇到问题。我解决了使用将两个容器放在同一网络中的解决方案,并在 Python app.

上的 DBHOST 中使用“Docker 名称”
docker network create <network_name>

现在我想把这 2 个Dockers 容器合为一个

docker-compose

但是现在我的应用程序找不到数据库。连接字符串是:

from flask import Flask, request, render_template


app = Flask(__name__)


#import decimal
import psycopg2

DBHOST = "mypostgres"
#DB_HOST = "localhost"
DB_NAME = "correntista"
DB_USER = "postgres"
DB_PASS = "mysecretpassword"
DB_PORT = 5432

conn = psycopg2.connect(dbname = DB_NAME, user = DB_USER, password = DB_PASS, host = DBHOST, port = DB_PORT)

cur = conn.cursor()

当我 运行 docker-compose

时容器名称改变
       Name                     Command              State     Ports  
----------------------------------------------------------------------
banco_api_1          python ./app.py                 Exit 1           
banco_mypostgres_1   docker-entrypoint.sh postgres   Up       5432/tcp

但我尝试在 DBHOST 中使用“banco_mypostgres_1”,但没有任何反应。

这是我的docker-compose.yml

version: "3"

#volumes:

networks:
    backend:

services:
    
    mypostgres:
            image: "mypostgres"
            networks:
                - backend
            environment:
                - bind-address=0.0.0.0
                - POSTGRES_PASSWORD=password 
                - POSTGRES_DB=db_name

    api:
            image: "my-docker_flask2"
            networks:
                - backend
            environment:
                - DBHOST=mypostgres 
            depends_on:
                - mypostgres

感谢您的帮助!

您必须在此处明确指定容器名称(对于 postgres),以便其他容器连接到它。

在网络上,您创建的容器可以使用容器名称相互通信,在您的情况下,容器名称将是一些自动生成的容器名称。

为此,您的 postgres 容器名称和 DBHOST 名称必须相同。

您可以编辑 docker-compose 文件并添加 postgres 的容器名称,如下所示:

services:
    
    mypostgres:
            image: "mypostgres"
            container_name: mypostgres
            networks:
                - backend
            environment:
                - bind-address=0.0.0.0
                - POSTGRES_PASSWORD=password 
                - POSTGRES_DB=db_name