无法从Flask连接到Postgres Docker容器

时间:2020-06-17 06:13:52

标签: python postgresql docker flask

我正在尝试将python flask应用程序连接到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

1 个答案:

答案 0 :(得分:1)

错误本身提供了见解:

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

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

您可以选择2种-使用localhost地址从flask应用程序进行连接,或者将flask应用程序作为docker-compose服务运行。

选项1-使用localhost

POSTGRES_HOST泊坞映像似乎未使用postgres环境变量。因此,您只需在环境文件中进行更改即可:

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

选项2-使用docker-compose运行flask

为此,您将需要创建一个简单的Dockerfile并将flask应用程序添加到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:

希望这可以帮助您