Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 备份postgres容器及其数据库_Docker - Fatal编程技术网

Docker 备份postgres容器及其数据库

Docker 备份postgres容器及其数据库,docker,Docker,所以我们有大约100个测试,每个测试连接到一个postgres实例并使用一个加载了一些数据的数据库。测试会编辑和更改这些数据,以便我们为每个测试重新加载postgres数据库 这需要很长的时间,所以我考虑使用Docker来完成这项工作,如下所示。我是docker的新手,以下是我使用的步骤: 1) 我将创建一个postgres容器,用我想要的测试数据库加载它,并使它准备好并得到完善 2) 使用此命令将我的容器另存为tar docker save -o postgres_testdatabase.

所以我们有大约100个测试,每个测试连接到一个postgres实例并使用一个加载了一些数据的数据库。测试会编辑和更改这些数据,以便我们为每个测试重新加载postgres数据库

这需要很长的时间,所以我考虑使用Docker来完成这项工作,如下所示。我是docker的新手,以下是我使用的步骤:

1) 我将创建一个postgres容器,用我想要的测试数据库加载它,并使它准备好并得到完善

2) 使用此命令将我的容器另存为tar

 docker save -o postgres_testdatabase.tar postgres_testdatabase
3) 对于每个测试,我都将一个新的tar加载到一个图像中

  docker load -i postgres_testdatabase.tar
4) 使用postgres实例运行容器

docker run -i -p 5432 postgres_testdatabase
5) 测试将运行并更改数据

6) 销毁容器并用新的测试数据库加载新容器

7) 运行第二个测试,依此类推

我的问题是,我发现当我将一个容器备份到tar并加载它,然后运行一个新的容器时,我没有得到我的数据库,我基本上得到了一个没有数据库的新的postgres安装

我做错了什么

编辑:

我尝试了以下建议之一,在将容器保存到图像之前提交更改,如下所示:

我将更新的容器提交到新图像。将该图像保存到tar文件,删除了我现有的容器。加载tar文件,然后从保存的图像运行新容器。我还是看不到我的数据库。。我认为这与数量有关。在没有卷的情况下如何执行此操作?如何强制所有数据都在容器中,以便与映像一起备份

编辑2 Warmoverflow建议在加载图像时使用sql文件加载所有数据。在我的例子中,这不起作用,因为数据是使用另一个软件(ArcGIS)仔细编写的,加上数据具有一些复杂的blob字段几何图形,因此加载脚本的sql文件不起作用。他还建议,如果我在同一台机器中喷射容器,我不需要将数据保存为tar。一旦我对我的数据感到满意并将其提交到图像中,我就可以将图像加载到一个新的容器中。谢谢你澄清这一点。问题仍然是如何将数据库保存在映像中,以便在恢复映像时,数据库随容器一起提供

编辑3

所以我从warmoverflow的建议中找到了一个解决方法,这应该可以解决我的问题。然而,我仍然在寻找一种更干净的方法来做到这一点

解决方案是执行以下操作:

  • 创建一个新的postgres容器
  • 在我的例子中,我使用ArcGIS来填充数据库 所以
  • 使用pg_dumpall将整个postgres实例转储到单个 使用此命令创建文件。我们可以从任何postgres运行此命令 客户端,我们不必将转储文件复制到容器中。我正在Windows上运行这个

    C:\ProgramFiles\PostgreSQL\9.3\bin>pg\U dumpall.exe-h 192.168.99.100-p 5432-U postgres>C:\Hussein\dump\pg\U test\U dump.dmp

  • 您现在可以安全地删除您的容器

  • 创建一个新的postgres容器
  • 在容器postgres实例上调用此命令以加载转储

    C:\ProgramFiles\PostgreSQL\9.3\bin>psql-f C:\Hussein\dump\pg_test\U dump.dmp-h 192.168.99.100-p 5432-U postgres

  • 运行测试,测试会破坏数据,所以我们需要重新加载,我们 只需重复上述步骤

我仍然非常希望容器映像包含数据库“在其中”,所以当我从映像运行容器时,我会得到数据库。如果有人能提出解决方案,那就太好了,这将为我节省大量时间

编辑4 最后Warmoverflow解决了这个问题!回答如下


谢谢

docker save
用于图像(将图像保存为tar文件)。您需要的是
docker commit
哪个提交容器更改图像,然后将其保存到tar。但是,如果所有测试的数据库都相同,则应该使用Dockerfile构建自定义映像,然后使用单个映像运行容器

如果您的数据是使用
sql
文件加载的,您可以按照官方postgres docker页面“如何扩展此图像”部分的说明进行操作。您可以创建包含以下内容的Dockerfile

FROM postgres
RUN mkdir -p /docker-entrypoint-initdb.d
ADD data.sql /docker-entrypoint-initdb.d/
将您的
data.sql
文件和Dockerfile放入一个新文件夹,然后运行
docker build-t custom\u postgres.
,这将为您构建一个自定义映像,每次您使用它运行一个新容器时,它都会在引导时加载sql文件

[更新]

根据问题中的新信息,问题的原因是官方的
postgres
图像在postgres数据文件夹
/var/lib/postgresql/data
中定义了一个
VOLUME
用于将数据保存在容器外部(当您使用
docker run-v
将主机文件夹装载到容器时),因此提交容器本身时,不会保存
VOLUME
内的任何数据。虽然这通常是一个好主意,但在这种特定情况下,我们实际上需要数据不是持久的,这样每次都可以启动一个新的容器,其中包含未修改的相同数据

解决方案是创建自己版本的postgres图像,并删除

  • 档案在
  • 将两个文件下载到新文件夹中
  • Dockerfile
  • 在Docker Quickstart Terminal中,切换到该文件夹,然后运行
    Docker build-t mypostgres.
    ,这将使用名称
    mypostgres
    构建您自己的postgres映像
  • 使用
    docker run-d-p 5432:5432-e POSTGRES_PASSWORD=123456 mypostgres
    启动容器。postgres db可在
    postgres:123456@192.168.99.100:5432
  • 使用ArcGIS正常输入数据
  • 提交conta