【问题标题】:pg_dump in Docker containerDocker 容器中的 pg_dump
【发布时间】:2018-10-03 10:41:25
【问题描述】:

我正在尝试通过 kubectl 在 Docker 容器中运行 pg_dump 并将输出保存到我​​的本地计算机。

这是我目前所拥有的:

kubectl exec -it MY_POD_NAME -- pg_dump -h DB_HOST -U USER_NAME SCHEMA_NAME > backup.sql

但是,这只是目前挂起。我相当肯定这是因为-- 忽略了>

kubectl exec -it MY_POD_NAME -- pg_dump -h DB_HOST -U USER_NAME SCHEMA_NAME 按预期输出到控制台。

【问题讨论】:

  • 我建议您将数据挂载到位于主机中的卷中,以在容器因入口点结束而终止时保留数据。因此,您的数据将是持久的。
  • 我不希望它被持久化到容器中,我希望它被持久化到我的本地机器,因此我用>重定向它
  • 我说的是一种在本地机器上持久化的方法,而不是容器。如果您使用的是 Linux,您可以 docker run postgre 容器和 -v /tmp/yourdatabackup:/var/lib/postgresql/8.x/ 因此,您的容器中的数据将始终可以从主机访问,因此可以在容器外部持久化
  • @Alex Galera 是对的。建议使用 docker 容器上的数据持久性在主机上进行挂载卷。
  • Docker 容器托管在 AWS 的 Kubernetes 中。感谢您的帮助,但您的建议不适用于这种情况,也不能解决我的实际问题。

标签: bash shell docker command-line kubernetes


【解决方案1】:

使用 kubectl port-forward POD_NAME 6000:5342 将您的 pod 端口(假设在 5432 上公开)转发到 localhost:6000

然后直接运行pg_dump,主机名为localhost,端口为6000

$ pg_dump -h DB_HOST -U USER_NAME SCHEMA_NAME > backup.sql

【讨论】:

  • 不幸的是,如果 postgres 在我 port-forward 的 Docker 容器的本地主机上运行,​​这只会解决我的问题。就我而言,这是一个远程 postgres 实例。
  • 不,这也适用于远程。你不能吗?
  • 它如何知道远程主机在哪里?如果我的 docker 容器通过 database.internaldns 之类的东西连接到远程实例,那么当我在本地计算机上通过 localhost 连接时,database.internaldns 指定在哪里?
  • kubectl 连接到远程 pod。
【解决方案2】:

设法解决了自己 - 不是最优雅的解决方案,但它有效。

首先我在集群中的一个 pod 上打开一个 shell,它可以通过网络访问 RDS 实例:

kubectl exec -it psql-xxx-xxx sh

连接到shell后,运行pg_dump备份数据库:

pg_dump -h db.internal.dns -U user schema_name > backup.sql

备份完成后,退出容器并将文件从 pod 复制到我的本地:

kubectl cp psql-xxx-xxx:/backup.sql ./backup.sql

将继续寻找一种简化的方法来做到这一点。

【讨论】:

    【解决方案3】:

    如果数据库确实在远程 kubernetes 实例中作为 docker 镜像运行,我就成功了

    kubectl exec -it POD_NAME -- pg_dump -h localhost -U DB_USER DB_NAME > backup.sql

    本地主机指向远程实例中的本地主机。直接从本地终端运行,这会将数据库转储保存到我的本地计算机,无论数据库本身是否在云中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2022-01-19
      • 2016-12-29
      • 2019-03-10
      • 2020-01-07
      相关资源
      最近更新 更多