【问题标题】:Dockerized PostgreSQL: psql: FATAL: the database system is starting upDockerized PostgreSQL: psql: FATAL: 数据库系统正在启动
【发布时间】:2017-02-22 17:19:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    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']
    

    【讨论】:

    • 在大致相同的情况下出现相同的错误。使用 pg_ctlcluster 在我的 Dockerfile 中的 RUN 之间巧妙地关闭服务解决了这个问题。谢谢
    • 如果 pg 不是集群而只有一个独立的数据库怎么办??
    【解决方案2】:

    我的问题是使用 pg_ctl 启动 postgres 并且在我的 docker 容器中运行测试之后。修复它的是在我的命令中添加“智能模式”,即:

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

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2020-11-04
      • 1970-01-01
      • 2011-10-08
      • 2014-09-03
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多