我正在尝试使用ansible-container构建和运行两个托管PostgreSQL和Citus扩展的Docker容器。我知道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入口点。我遗漏了什么?
发布于 2017-02-23 20:43:10
该问题与pg_ctl stop模式(pg_ctl由pg_ctlcluster调用)的默认关闭方法有关。在构建过程中使用pg_ctl选项-m smart通过pg_ctlcluster停止集群可以解决此问题:
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']发布于 2019-02-07 07:40:43
我的问题是使用pg_ctl启动postgres,然后在我的docker容器中运行测试。修复方法是将“智能模式”添加到我的命令中,即:
su - postgres -c 'pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log -m smart'https://stackoverflow.com/questions/42398199
复制相似问题