Dockerized PostgreSQL:psql:FATAL:数据库系统正在启动

时间:2017-02-22 17:19:32

标签: postgresql docker ansible docker-compose ansible-container

我正在尝试使用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入口点。我错过了什么?

2 个答案:

答案 0 :(得分:5)

问题与pg_ctl stop模式的默认关闭方法有关(pg_ctl调用pg_ctlcluster)。在构建过程中使用pg_ctlcluster选项pg_ctl通过-m smart停止群集可解决此问题:

pg_ctlcluster 9.6 master stop -- -m smart

" smart"方法等待活动客户端断开连接并在关闭之前完成联机备份,与默认的" fast"相比方法。这在pg_ctl的文档中有解释。

此外,pg_ctlcontrol进程通过postgrespg_ctlcontrol - > pg_ctl - > {{1}成功启动数据库群集后,容器将退出})。为防止这种情况,可以直接调用postgres。然后postgres文件如下所示:

container.yml

答案 1 :(得分:0)

我的问题是在Docker容器中运行测试后立即使用pg_ctl启动postgres。解决该问题的方法是在命令中添加“智能模式”,即:

su - postgres -c 'pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log -m smart'