首页 > 解决方案 > 无法从 Flask 连接到 Postgres Docker 容器

问题描述

我正在尝试将 python 烧瓶应用程序连接到 postgres docker 容器内的数据库。

我有以下内容database.conf

POSTGRES_USER=testdbuser
POSTGRES_PASSWORD=testdbpass
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=testdb

config.py

import os

user = os.environ['POSTGRES_USER']
password = os.environ['POSTGRES_PASSWORD']
host = os.environ['POSTGRES_HOST']
database = os.environ['POSTGRES_DB']
port = os.environ['POSTGRES_PORT']

DATABASE_CONNECTION_URI = f'postgresql+psycopg2://{user}:{password}@{host}:{port}/{database}'

最后docker-compose.yml

version: '3.5'
services:
  database:
    container_name: postgres-test
    image: postgres:latest
    env_file: database.conf
    ports:
      - 5432:5432
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

我在docker-compose up --build -d-> export $(xargs < database.conf)-> export FLASK_APP=app.py->之后遇到的错误flask run是:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "postgres" to address: nodename nor servname provided, or not known

标签: pythonpostgresqldockerflask

解决方案


错误本身提供了洞察力:

could not translate host name "postgres" to address: nodename nor servname provided, or not known

该主机postgres在 DNS 或您的本地网络中不存在。SQLAlchemy无法连接到它。这在逻辑上就是这种情况,因为您创建了一个 docker 容器并将端口转发5432到本地计算机。

您可以选择 2 个选项 - 使用该localhost地址从烧瓶应用程序连接或将烧瓶应用程序作为 docker-compose 服务运行。

选项 1 - 使用localhost

docker镜像POSTGRES_HOST似乎没有使用环境变量。postgres所以你可以在环境文件中改变它:

POSTGRES_USER=testdbuser
POSTGRES_PASSWORD=testdbpass
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=testdb

选项 2 - 使用 docker-compose 运行烧瓶

为此,您需要创建一个简单Dockerfile的烧瓶应用程序并将其添加到docker-compose.yml文件中。

我建议Dockerfile像这样简单的东西:

FROM python

COPY . /app
# How you install your python packages may differ
RUN pip install -r /app/requirements.txt

# Ensure the path here is correct
ENV FLASK_APP /app/app.py

CMD flask run

然后您需要将其添加到docker-compose.yml文件中:

version: '3.5'
services:
  database:
    container_name: postgres-test
    image: postgres:latest
    env_file: database.conf
    ports:
      - 5432:5432
    volumes:
      - postgres-data:/var/lib/postgresql/data

  flask:
    build:
      context: .
      dockerfile: Dockerfile
    environment:  # or use env_file as you did above
      POSTGRES_USER: testdbuser
      POSTGRES_PASSWORD: testdbpass
      POSTGRES_HOST: database     # This is the name of the database service in this file above
      POSTGRES_PORT: 5432
      POSTGRES_DB: testdb
    depends_on:
      - database

volumes:
  postgres-data:

希望这能让你继续前进。


推荐阅读