Dockerized PostgreSQL:psql:致命:数据库系统正在启动
我正在尝试构build和运行两个托pipePostgreSQL和Citus扩展使用ansible-container
Docker ansible-container
。 我知道Citus提供容器,但是我想build立自己的容器。
我的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']
在构build过程中,我可以通过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: []
创build容器并在容器中运行ps aux
,我看到以下过程:
postgres 14 1.6 0.1 307504 3480 ? Ds 16:46 0:00 postgres: 9.6/master: startup process
我也试过没有dumb-init
入口点。 我错过了什么?
该问题与pg_ctl stop
模式的默认closures方法有关( pg_ctl
被pg_ctlcluster
)。 在构build过程中使用pg_ctl
选项通过pg_ctlcluster
停止集群可以解决这个问题:
pg_ctlcluster 9.6 master stop -- -m smart
与默认的“快速”方法相比,“智能”方法等待活动客户端断开连接并在线备份完成后再closures。 这在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']