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

mdh*_*mdh 4 postgresql ansible docker docker-compose ansible-container

我正在尝试使用构建并运行两个托管PostgreSQL和Citus扩展的Docker容器ansible-container。我知道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']
Run Code Online (Sandbox Code Playgroud)

在构建过程中,我可以通过启动和停止集群,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
Run Code Online (Sandbox Code Playgroud)

使用容器构建容器command: []ps aux在容器中运行时,会看到以下过程:

postgres    14  1.6  0.1 307504  3480 ?        Ds   16:46   0:00 postgres: 9.6/master: startup process
Run Code Online (Sandbox Code Playgroud)

我也尝试过没有dumb-init入口点。我想念什么?

mdh*_*mdh 5

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

pg_ctlcluster 9.6 master stop -- -m smart
Run Code Online (Sandbox Code Playgroud)

与默认的“快速”方法相比,“智能”方法等待活动的客户端断开连接并完成在线备份,然后再关闭。pg_ctl的文档对此进行了解释。

另外,一旦pg_ctlcontrol进程通过postgrespg_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']
Run Code Online (Sandbox Code Playgroud)

  • 如果pg不是集群,而只是一个独立的db,该怎么办? (2认同)