使用数据库

时间:2016-03-12 01:22:52

标签: docker

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

这需要很长时间,所以我想到如下使用Docker。我是docker的新手,所以这就是我使用的步骤:

1)我会创建一个postgres容器,使用我想要的测试数据库加载它并使其准备就绪并进行抛光。

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

 docker save -o postgres_testdatabase.tar postgres_testdatabase

3)对于每个测试,我将新焦油加载到图像中

  docker load -i postgres_testdatabase.tar

4)使用postgres实例运行容器

docker run -i -p 5432 postgres_testdatabase

5)测试运行并更改数据..

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

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

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

我做错了什么?

编辑:

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

我将更新的容器提交到新图像。将Image保存到tar文件,删除了我现有的容器。加载tar文件,然后从我保存的图像中运行一个新容器。我仍然没有看到我的数据库..我相信它必须与Volumes做点什么。如果没有卷,我该怎么做?如何强制我的所有数据都在容器中,以便备份图像?

EDIT2 Warmoverflow建议我在加载图像时使用sql文件加载我的所有数据。这不适用于我的情况,因为数据是使用其他软件(ArcGIS)精心编写的,加上数据有一些复杂的blob字段几何,因此加载脚本的sql文件无法正常工作。他还建议我不需要将数据保存为tar,如果我在同一台机器上运送容器。一旦我对我的数据感到满意并将其提交给图像,我就可以将图像加载到新容器中。谢谢你澄清这一点。问题仍然是如何将我的数据库保留在我的图像中,因此当我恢复图像时,数据库随容器一起提供。

EDIT3

所以我找到了一个受hotoverflow建议启发的解决方法,这应该可以解决我的问题。但是,我仍然在寻找一种更清洁的方法。

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

  • 创建一个新鲜的postgres容器。
  • 根据需要填充数据库,在我的情况下,我使用ArcGIS来完成 所以
  • 使用pg_dumpall将整个postgres实例转储为单个实例 使用此命令的文件。我们可以从任何postgres运行此命令 客户端,我们不必将转储文件复制到容器中。我是从Windows运行的。

    C:\ Program Files \ PostgreSQL \ 9.3 \ bin> pg_dumpall.exe -h 192.168.99.100 -p 5432 -U postgres> C:\萨达姆\转储\ pg_test_dump.dmp

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

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

    C:\ Program Files \ PostgreSQL \ 9.3 \ bin> psql -f c:\ Hussein \ dump \ pg_test_dump.dmp -h 192.168.99.100 -p 5432 -U postgres

  • 运行测试,测试将拧紧数据,所以我们需要重新加载,我们 只需重复上述步骤。

我仍然,真的希望容器图像拥有数据库"在其中"所以当我从图像运行容器时,我得到了数据库。如果有人能提出解决方案,那将会很棒,这将为我节省大量时间。

Edit4 最后,Warmoverflow解决了它!答案如下

由于

1 个答案:

答案 0 :(得分:5)

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

如果使用sql文件加载数据,则可以按照"如何扩展此图像"上的说明进行操作。官方postgres docker页面https://hub.docker.com/_/postgres/的一部分。您可以使用以下内容创建Dockerfile

FROM postgres
RUN mkdir -p /docker-entrypoint-initdb.d
ADD data.sql /docker-entrypoint-initdb.d/

将您的data.sql文件和Dockerfile放在一个新文件夹中,然后运行docker build -t custom_postgres .,这将为您构建一个自定义图像,每次使用它运行一个新容器时,它将加载启动时的sql文件。

[更新]

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

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

  1. 文件位于https://github.com/docker-library/postgres/tree/master/9.3
  2. 两个文件下载到新文件夹
  3. VOLUME
  4. 中删除Dockerfile
  5. 在Docker快速入门终端中,切换到该文件夹​​,然后运行docker build -t mypostgres .,这将构建您自己的名为mypostgres的postgres图像。
  6. 使用docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 mypostgres启动容器。 postgres数据库可在postgres:123456@192.168.99.100:5432
  7. 获得
  8. 使用ArcGIS正常输入数据
  9. 使用docker commit container_id_from_step_5 mypostgres_withdata提交容器。这会创建您自己的postgres图像包含数据
  10. 停止并移除中间容器docker rm -f container_id_from_step_5
  11. 每次需要新容器时,在Docker Quickstart终端中,运行docker run -d -p 5432:5432 mypostgres_withdata以启动容器,并记住之后停止或删除用过的容器,以免它占用5432端口。