Dockerized PostgreSQL: psql: FATAL: система баз данных запускается

Я пытаюсь собрать и запустить два контейнера Docker, на которых размещены расширения PostgreSQL и Citus, используя ansible-container, Я знаю, что Citus предоставляет контейнеры, но я хочу построить свой собственный.

мой container.yaml выглядит следующим образом:

version: '2'

services:

  database_master:
    image: hackermd/ubuntu-trusty-python
    user: postgres
    expose:
      - 5043
    entrypoint: ['dumb-init', '--']
    command: ['/usr/bin/pg_ctlcluster', '9.6', 'master', 'start']
    links:
      - database_worker
    depends_on:
      - database_worker

  database_worker:
    image: hackermd/ubuntu-trusty-python
    user: postgres
    expose:
    - 9700
  entrypoint: ['dumb-init', '--']
  command: ['/usr/bin/pg_ctlcluster', '9.6', 'worker', 'start']

В процессе сборки я могу запустить и остановить кластер с помощью pg_ctlcluster и это заканчивается успешно. Однако, когда я впоследствии запускаю контейнеры, я получаю следующую ошибку:

$ docker logs ansible_database_master_1
Removed stale pid file.
Warning: connection to the database failed, disabling startup checks:
psql: FATAL:  the database system is starting up

Когда я строю контейнеры с command: [] и беги ps aux внутри контейнера я вижу следующий процесс:

postgres    14  1.6  0.1 307504  3480 ?        Ds   16:46   0:00 postgres: 9.6/master: startup process

Я также пытался без dumb-init точка входа. Что мне не хватает?

1 ответ

Решение

Проблема связана с методом отключения по умолчанию pg_ctl stop Режим (pg_ctl вызывается pg_ctlcluster). Остановка кластера через pg_ctlcluster с pg_ctl вариант -m smart В процессе сборки решается эта проблема:

pg_ctlcluster 9.6 master stop -- -m smart

"Умный" метод ожидает отключения активных клиентов и завершения резервного копирования в онлайн-хранилище, а затем завершает работу в отличие от "быстрого" метода по умолчанию. Это объясняется в документации к pg_ctl.

Кроме того, контейнер будет выходить, как только pg_ctlcontrol процесс успешно запустил кластер базы данных через postgres (pg_ctlcontrol -> pg_ctl -> postgres). Чтобы предотвратить это, postgres можно вызвать напрямую. container.yml файл будет выглядеть следующим образом:

version: '2'

services:

  database_master:
    image: hackermd/ubuntu-trusty-python
    user: postgres
    expose:
      - 5043
    command: ['dumb-init', '/usr/lib/postgresql/9.6/bin/postgres', '-D', '/var/lib/postgresql/9.6/master']
    links:
      - database_worker
    depends_on:
      - database_worker

  database_worker:
    image: hackermd/ubuntu-trusty-python
    user: postgres
    expose:
      - 9700
    command: ['dumb-init', '/usr/lib/postgresql/9.6/bin/postgres', '-D', '/var/lib/postgresql/9.6/worker']

Моя проблема была с запуском postgres с использованием pg_ctl и сразу после запуска тестов в моем док-контейнере. Что исправило добавление "умного режима" к моей команде, а именно:

su - postgres -c 'pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log -m smart'
Другие вопросы по тегам