在 docker 容器中的数据库转储之间切换的方法

Way to switch between database dumps in a docker containers

情况:我正在做一个大型的启动 web 项目,它经常投入生产,所以所有的开发都非常快。我们有几个环境——开发(本地)、QA、阶段和生产,当然数据库中有不同的数据(我们使用 postgres)。我的日常工作是,当我开发一些新功能时,一些 QA 人员会在其中一个环境中发现一个严重的错误,所以我必须修复它,或者至少看看哪里出了问题。

问题:要从本地上下文切换到production/qa/stage,我通常会从这些环境中将数据库转储到本地,然后进行调试。问题是,起初,转储非常繁重,有时需要 30 分钟才能下载和应用它,其次 - 当我将它转储到本地数据库时,我正在失去本地开发环境。

希望: 能够在本地快速切换上下文

示例:假设我们有用于 Web 服务器的 docker 容器,它像本示例中那样 linked 到 postgres 容器 docker-compose.yml 文件

version: '3'

services:
  pg:
    image: "mdillon/postgis"
    hostname: pghost
    ports:
          - "5433:5432"
    volumes:
          - "~/pgdata:/var/lib/postgresql/data"
    ...
  webserver:
    image: "some_app_image"
    links:
          - pg:postgres
   ...

让我们假装这个网络服务器真的很重,以至于有多个 运行 容器,这在内存使用和可读性方面将是一个大问题。

问题:有没有优雅(或不优雅)的方式在不同的数据库数据集之间进行快速切换?可能有不同的 pgdata 文件夹,或者以某种方式 link 几个 postgres 容器(虽然我不确定这是否可能)

它永远不会,因为事实上备份、下载和恢复大型数据库需要时间。您真正可以充分控制以进行优化的是经常您必须做这三件事中的任何一件。您的选择归结为使用诸如 RDS 或 Google Cloud SQL 之类的服务,这将使您可以按需将数据库备份和恢复到云中,并完全消除下载;或自动生成备份,下载(使用编排系统,您可以 'download' 到主机服务器并启动一个新的数据库容器以使用一些脚本来恢复备份,这比通过发送备份快得多电线),并在计时器上恢复进程和 运行 它们以设置可用于测试的安全沙箱数据库。后者从实时延迟确实意味着如果全新的数据显示出缺陷,您仍然需要等待更新您的沙箱,但这仍然是值得的。