postgresql - Dockerized PostgreSQL : psql: FATAL: the database system is starting up

标签 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 入口点。我错过了什么?

最佳答案

问题与 pg_ctl stop 模式的默认关闭方法有关(pg_ctlpg_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)。为了防止这种情况,可以直接调用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']

关于postgresql - Dockerized PostgreSQL : psql: FATAL: the database system is starting up,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42398199/

相关文章:

arrays - 将 postgres 中的一组数组展平为单个数组

linux - 为什么 "/usr/bin/env bash -x"只能在命令行中工作?

Docker,如何替换 docker 中的 capistrano 任务

sql - 删除重复的 SQL 连接结果

sql - 加入 2 个临时表

postgresql - 如何使用 JDBC 连接在 PostgreSQL 中捕获命令输出?

mysql - 如何从mysql workbench连接到远程主机上的mysql docker容器?

docker - 如何修改正在运行的 pod 的 pod 内存限制

ssh - Ansible - 建立初始 SSH 连接

yaml - Ansible AnsibleUndefineVariable 无属性