【问题标题】:How do I stop postgresql server inside container?如何停止容器内的 postgresql 服务器?
【发布时间】:2021-02-27 12:03:01
【问题描述】:

我需要在正在运行的容器中升级 postgresql 数据库。为此,我需要停止旧服务器,以便启动新服务器。问题是我没有找到如何通过 systemctl、pg_ctl 或服务停止正在运行的 postgres 进程。

pg_ctl:

root@postgres-7ffd788bc9-g2dkv:/# su postgres
$ pg_ctl status
sh: 1: pg_ctl: not found

systemctl:

root@postgres-7ffd788bc9-g2dkv:/# systemctl status postgresql
bash: systemctl: command not found

服务(不返回任何内容):

root@postgres-7ffd788bc9-g2dkv:/# service postgresql status
root@postgres-7ffd788bc9-g2dkv:/# 

postgresql 是使用这个 kubernetes yaml 创建的:

    spec:
      containers:
        - name: postgres
          image: postgres:10.4

服务器正在运行:

root@postgres-7ffd788bc9-g2dkv:/# psql postgresql://user:pass@127.0.0.1:5432/postgresdb
psql (12.5 (Debian 12.5-1.pgdg90+1), server 10.4 (Debian 10.4-2.pgdg90+1))
Type "help" for help.
postgresdb=# select VERSION();
                                                             version                                                              
----------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 10.4 (Debian 10.4-2.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
(1 row)

你有什么建议?

【问题讨论】:

  • 一个 docker 容器通常应该只执行一个任务。假设您从 docker repo 中获取了默认的 Postgres 容器,这意味着停止容器等同于停止服务。事实上,如果您使用 SSH 登录到容器,您可能会发现停止服务会导致容器停止。所以就像@Marc Salvetti 在他的回答中提到的那样,只需停止容器并重建即可。如果容器内有数据(这不是一个好的做法),则需要先备份所述数据。

标签: postgresql docker kubernetes


【解决方案1】:

如何停止容器,更改 yaml 中的版本然后重建?

【讨论】:

  • 在 yaml 中更改版本不起作用,因为The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 12.5
  • @justadev 如果您运行 brew postgresql-upgrade-database 会怎样,如下所述:stackoverflow.com/questions/17822974/…
  • 我认为来自 Lajos 的链接可能是解决方案。您需要在数据目录上启动升级过程,然后使用新版本重建容器。
  • 我正在尝试在 postgres pod 中安装 brew,但安装脚本需要 sudo,并且它在映像中不存在。
  • @justadev 你的容器中有高权限用户吗?
【解决方案2】:

我最后做的是在 Kubernetes 中创建一个并行的 postgres pod,它包含新版本。然后我从旧服务器转储数据库,将其复制到新服务器,并用它来初始化那里的数据库。

以下是一一步骤:

  1. 使用新版本创建并行 postgres 服务

  2. 在旧版本的 pod 中:

pg_dumpall -U postgresadmin -h localhost -p 5432 > dumpall.sql
  1. 在主机中:
kubectl cp postgres-old-pod:/dumpall.sql dumpall.sql
kubectl cp dumpall.sql postgres2-new-pod:/dumpall.sql
  1. ssh 到新 pod

  2. 我需要的额外步骤,因为由于某种原因,新 pod 没有创建“postgres”用户: 使用您的凭据进入 postgres 客户端:

psql postgresql://postgresadmin:pass1234@127.0.0.1:5432/postgresdb?sslmode=disable
postgresdb=# CREATE ROLE postgres LOGIN SUPERUSER PASSWORD 'somepassword123';

然后退出 postgres 并退出到普通用户

  1. 最后更新数据库:
psql -U postgres -W -f dumpall.sql

【讨论】:

    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2012-02-27
    • 2017-06-14
    • 2011-10-18
    • 2014-01-04
    • 2021-08-09
    相关资源
    最近更新 更多