docker-compose с несколькими базами данных postgres из дампов sql - PullRequest
0 голосов
/ 29 апреля 2018

Я знаю, что это может выглядеть как дубликат docker-compose с несколькими базами данных , но я все еще не могу заставить его работать после прохождения ответов.

Вот мой docker-compose.yml:

version: '3'
services:
  backend:
    image: backend:1.0
    build: ./backend
    ports:
      - "9090:9090"
    depends_on:
      - db
      - ppt
    environment:
      - DATABASE_HOST=db
  db:
    image: main_db:26.03.18
    restart: always
    build: ./db
    ports:
      - "5432:5432"
  ppt:
    image: ppt_generator:1.0
    build: ./ppt
    ports:
      - "6060:6060"
  login:
    image: login:1.0
    build: ./login
    ports:
      - "7070:7070"
    depends_on:
      - login_db
  login_db:
    image: login_db:27.04.2018
    restart: always
    build: ./login_db
    ports:
      - "5433:5433"

Обратите внимание, что у меня одна база данных на порту 5433, а другая на 5432. Однако, когда я запускаю docker ps после запуска контейнеров, я получаю следующее. Я не до конца понимаю, что происходит с портами.

CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                              NAMES
997f816ddff3        backend:1.0           "/bin/sh -c 'pytho..."   About a minute ago   Up About a minute   0.0.0.0:9090->9090/tcp             backendservices_backend_1
759546109a66        login:1.0             "/bin/sh -c 'pytho..."   About a minute ago   Up About a minute   0.0.0.0:7070->7070/tcp, 9090/tcp   backendservices_login_1
a2a26b72dd0c        login_db:27.04.2018   "docker-entrypoint..."   About a minute ago   Up About a minute   5432/tcp, 0.0.0.0:5433->5433/tcp   backendservices_login_db_1
3f97de7fc41e        main_db:26.03.18   "docker-entrypoint..."   About a minute ago   Up About a minute   0.0.0.0:5432->5432/tcp             backendservices_db_1
1a61e741ccba        ppt_generator:1.0     "/bin/sh -c 'pytho..."   About a minute ago   Up About a minute   0.0.0.0:6060->6060/tcp             backendservices_ppt_1

Оба моих docker-файла базы данных по существу идентичны, за исключением номера порта, который я предоставляю:

FROM postgres:9.6.3
ENV POSTGRES_USER ludo
ENV POSTGRES_PASSWORD password
ENV POSTGRES_DB login
EXPOSE 5433

ADD db_dump.sql /docker-entrypoint-initdb.d

Это ошибка, которую я получаю:

backend_1   | Traceback (most recent call last):
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2147, in _wrap_pool_connect
backend_1   |     return fn()
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 387, in connect
backend_1   |     return _ConnectionFairy._checkout(self)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 766, in _checkout
backend_1   |     fairy = _ConnectionRecord.checkout(pool)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516, in checkout
backend_1   |     rec = pool._do_get()
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1138, in _do_get
backend_1   |     self._dec_overflow()
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
backend_1   |     compat.reraise(exc_type, exc_value, exc_tb)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
backend_1   |     raise value
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1135, in _do_get
backend_1   |     return self._create_connection()
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 333, in _create_connection
backend_1   |     return _ConnectionRecord(self)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 461, in __init__
backend_1   |     self.__connect(first_connect_check=True)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 651, in __connect
backend_1   |     connection = pool._invoke_creator(self)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect
backend_1   |     return dialect.connect(*cargs, **cparams)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 393, in connect
backend_1   |     return self.dbapi.connect(*cargs, **cparams)
backend_1   |   File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
backend_1   |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
backend_1   | psycopg2.OperationalError: could not connect to server: Connection refused
backend_1   |   Is the server running on host "localhost" (127.0.0.1) and accepting
backend_1   |   TCP/IP connections on port 5432?
backend_1   | could not connect to server: Cannot assign requested address
backend_1   |   Is the server running on host "localhost" (::1) and accepting
backend_1   |   TCP/IP connections on port 5432?
backend_1   | 

Почему БД не работает на порту 5432? Раньше он работал, когда у меня была только одна база данных, а теперь с двумя, кажется, она перепутана ...?

UPDATE Я могу получить доступ к базам данных соответственно через порты 5432 и 5433 локально. Однако из моего внутреннего контейнера я не могу. Кажется, что мой внутренний контейнер не получает ничего, работающего через порт 5432. Как сделать порт 5432 контейнера db видимым для внутреннего контейнера?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

UPDATE

После долгих раздумий я заставил его работать. Как предложил @ Iarwa1n, вы отображаете один дБ как "5432:5432", а другой как "5433:5432". Ошибка, с которой я столкнулся, была вызвана тем, как я вызывал postgres из самого приложения. Важно понимать, что хост postgres больше не является localhost, а любым именем, которое вы дали службе базы данных в docker-compose.yaml. В моем случае; db для backend и login_db для login. Кроме того, мне пришлось сменить драйвер с postgresql на postgres - не уверен, почему это так ...

Таким образом, мой db_url в конечном итоге выглядел так из моего внутреннего приложения python:

postgres://ludo:password@db:5432/main_db

И определяется таким образом:

DATABASE_CONFIG = {
    'driver': 'postgres',
    'host': 'db',
    'user': 'ludo',
    'password': 'password',
    'port': 5432,
    'dbname': main_db
}
db_url = '{driver}://{user}:{password}@{host}:{port}/{dbname}'.format(database_config)

Обратите внимание на две вещи:

1) Независимо от того, как вы отобразили свои порты, вы всегда должны подключаться к стандартному порту postgres 5432 из вашего приложения

2) Если вы используете библиотеку Python для запросов (как и я), убедитесь, что вы также изменили URL соответствующим образом. Например, у меня была служба ppt, которую я вызывал через библиотеку запросов, и мне пришлось изменить URL-адрес на: 'http://ppt:6060/api/getPpt' вместо 'http://localhost:6060/api/getPpt'

0 голосов
/ 29 апреля 2018

Процесс postgres на обеих ваших машинах прослушивает 5432, так как это поведение по умолчанию. Просто EXPOSE вы не меняете это, это просто означает, что контейнер предоставляет порт 5433 вместо 5432. Но на этом порту ни один процесс не прослушивает. Попробуйте изменить следующее:

FROM postgres:9.6.3
ENV POSTGRES_USER ludo
ENV POSTGRES_PASSWORD password
ENV POSTGRES_DB login
EXPOSE 5432
ADD db_dump.sql /docker-entrypoint-initdb.d

и затем измените docker-compose следующим образом:

login_db:
    image: login_db:27.04.2018
    restart: always
    build: ./login_db
    ports:
      - "5433:5432"

Теперь вы можете получить доступ к «db» на 5432 (с хоста) и «login_db» на 5433 с хоста. Обратите внимание, что вам все еще нужно использовать 5432 для доступа к одной из БД из другого контейнера.

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