подключиться к контейнеру postgres из приложения фляги внутри контейнера - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть приложение фляги app.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

APP = Flask(__name__)
DB = SQLAlchemy()

if __name__ == '__main__':
    APP.config.from_mapping(
        SQLALCHEMY_DATABASE_URI='postgres://postgres:password@0.0.0.0:5432',
        SQLALCHEMY_TRACK_MODIFICATIONS=False
    )
    DB.init_app(APP)
    DB.create_all(app=APP)
    APP.run(use_reloader=False, host='0.0.0.0', port='5000')

, и у меня есть Dockerfile для него:

FROM python:3.6-alpine

RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev

WORKDIR /root

COPY app.py .

RUN pip3 install Flask==1.0.2
RUN pip3 install psycopg2-binary==2.7.6.1
RUN pip3 install Flask-SQLAlchemy==2.3.2

CMD ["python3", "app.py"]

Я запускаю:

docker build . --tag flaskapp:1
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password --name database postgres
docker run --rm -p 5000:5000 flaskapp:1

Затем я получаю исключение, которое указывает:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
    Is the server running on host "0.0.0.0" and accepting
    TCP/IP connections on port 5432?

Как мне это исправить?

1 Ответ

0 голосов
/ 01 декабря 2018

Вы указали 0.0.0.0 в качестве IP-адреса для подключения, что не имеет смысла.0.0.0.0 - «Любой адрес».Вы, вероятно, видели сообщение, которое postgres слушал на 0.0.0.0, откуда вы и получили его.В контексте прослушивания сервера 0.0.0.0 это означает, что он прослушивает все интерфейсы ipv4.См. https://en.wikipedia.org/wiki/0.0.0.0 для получения дополнительной информации о специальном адресе 0.0.0.0 и его значении.

Если вы хотите подключиться к службе postgres, вам потребуется использовать действующий IP-адрес или DNSимя, где он работает.

В Docker, если у вас есть несколько именованных контейнеров, подключенных к одной и той же определенной пользователем сети, вы можете использовать встроенный механизм обнаружения служб, с которым поставляется Docker.

Вот модифицированный набор команд, которые нужно запустить, чтобы воспользоваться этим:

docker network create mynet
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password --net mynet --name database postgres
docker run --rm -p 5000:5000 --net mynet flaskapp:1

Обязательно измените код для подключения к postgres://postgres:password@database:5432 вместо postgres://postgres:password@0.0.0.0:5432

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