Невозможно подключиться из Flask к Postgres Docker контейнеру - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь подключить приложение 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 Ответ

1 голос
/ 17 июня 2020

Сама ошибка дает представление:

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

Хост postgres не существует в DNS или в вашей локальной сети. SQLAlchemy не может подключиться к нему. Это логично, поскольку вы создали контейнер docker и перенаправили порт 5432 на локальный компьютер.

Есть 2 варианта, которые вы можете выбрать - либо использовать адрес localhost для подключения с flask app или запустите приложение flask как службу docker -compose.

Вариант 1 - используйте localhost

Переменная среды POSTGRES_HOST, похоже, не используется изображением postgres docker. Таким образом, вы можете просто изменить это в файле среды:

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

Вариант 2 - запустите flask с помощью docker -compose

Для этого вам нужно будет создать простой 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:

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...