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_ctlpg_ctlcluster )。 在构build过程中使用pg_ctl选项通过pg_ctlcluster停止集群可以解决这个问题:

 pg_ctlcluster 9.6 master stop -- -m smart 

与默认的“快速”方法相比,“智能”方法等待活动客户端断开连接并在线备份完成后再closures。 这在pg_ctl的文档中有解释。

另外,一旦pg_ctlcontrol进程通过postgrespg_ctlcontrol – > pg_ctl – > postgres )成功启动数据库集群,容器将退出。 为了防止这种情况,可以直接调用postgrescontainer.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']