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

时间:2017-09-22 21:24:13

标签: database postgresql docker docker-compose test-environments

情况:我正在开发一个大型创业网络项目,经常投入生产,因此所有开发都非常快。我们有几个环境 - 开发(本地),QA,阶段和生产,当然数据库中有不同的数据(我们使用postgres)。我的日常工作是,当我处理一些新功能时,一些QA人员可以在其中一个环境中找到关键错误,因此我必须修复它,或者至少看看有什么问题。

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

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

示例:假设我们有用于Web服务器的docker容器,该容器链接到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文件夹,或以某种方式链接几个postgres容器(虽然我不确定它是否可能)

1 个答案:

答案 0 :(得分:1)

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