Dockerized PostgreSQL: psql: FATAL: 数据库系统正在启动
Dockerized PostgreSQL: psql: FATAL: the database system is starting up
我正在尝试使用 ansible-container
构建和 运行 两个 Docker 容器托管 PostgreSQL 和 Citus 扩展。我知道 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
入口点。我错过了什么?
问题与 pg_ctl stop
模式的默认关闭方法有关(pg_ctl
被 pg_ctlcluster
调用)。在构建过程中使用 pg_ctl
选项 -m smart
通过 pg_ctlcluster
停止集群解决了这个问题:
pg_ctlcluster 9.6 master stop -- -m smart
与默认的 "fast" 方法不同,"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']
我的问题是使用 pg_ctl 启动 postgres 并在我的 docker 容器中进行 运行 测试之后。修复它的方法是在我的命令中添加 "smart mode",即:
su - postgres -c 'pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log -m smart'
我正在尝试使用 ansible-container
构建和 运行 两个 Docker 容器托管 PostgreSQL 和 Citus 扩展。我知道 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
入口点。我错过了什么?
问题与 pg_ctl stop
模式的默认关闭方法有关(pg_ctl
被 pg_ctlcluster
调用)。在构建过程中使用 pg_ctl
选项 -m smart
通过 pg_ctlcluster
停止集群解决了这个问题:
pg_ctlcluster 9.6 master stop -- -m smart
与默认的 "fast" 方法不同,"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']
我的问题是使用 pg_ctl 启动 postgres 并在我的 docker 容器中进行 运行 测试之后。修复它的方法是在我的命令中添加 "smart mode",即:
su - postgres -c 'pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log -m smart'