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'