所以我们有大约100个测试,每个测试连接到postgres实例并使用加载了一些数据的数据库.测试编辑并更改数据,以便我们为每个测试重新加载postgres数据库.
这需要很长时间,所以我想到如下使用Docker.我是docker的新手,所以这就是我正在使用的步骤:
1)我将创建一个postgres容器,使用我想要的测试数据库加载它并使其准备好和抛光.
2)使用此命令将我的容器保存为tar
docker save -o postgres_testdatabase.tar postgres_testdatabase
Run Code Online (Sandbox Code Playgroud)
3)对于每个测试,我将新焦油加载到图像中
docker load -i postgres_testdatabase.tar
Run Code Online (Sandbox Code Playgroud)
4)使用postgres实例运行容器
docker run -i -p 5432 postgres_testdatabase
Run Code Online (Sandbox Code Playgroud)
5)测试运行并更改数据..
6)销毁容器并使用新的测试数据库加载新容器
7)运行第二次测试,依此类推.
我的问题是,我发现当我将容器备份到tar并加载它然后运行一个新容器我没有得到我的数据库时,我基本上得到了一个没有我的数据库的新鲜postgres安装.
我做错了什么?
编辑:
在我将容器保存到图像之前,我尝试了其中一个建议来提交我的更改,如下所示:
我将更新的容器提交到新图像.将Image保存到tar文件,删除了我现有的容器.加载tar文件,然后从我保存的图像中运行一个新容器.我仍然没有看到我的数据库..我相信它必须对Volumes做些什么.如果没有卷,我该怎么做?如何强制所有数据都在容器中,以便备份图像?
EDIT2 Warmoverflow建议我在加载图像时使用sql文件加载我的所有数据.这不适用于我的情况,因为数据是使用其他软件(ArcGIS)精心编写的,加上数据有一些复杂的blob字段几何,因此加载脚本的sql文件无法正常工作.他还建议我不需要将数据保存为tar,如果我在同一台机器上运送容器.一旦我对我的数据感到满意并将其提交给图像,我就可以将图像加载到新容器中.谢谢你澄清这一点.问题仍然是如何将我的数据库保留在我的图像中,因此当我恢复图像时,数据库随容器一起提供.
EDIT3
所以我找到了一个灵感来自hotoverflow建议的解决方法,这应该可以解决我的问题.但是,我仍然在寻找一种更清洁的方法来做到这一点.
解决方案是执行以下操作:
使用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:\ Hussein\dump\pg_test_dump.dmp
您现在可以安全地删除容器.
在容器postgres实例上调用此命令以加载转储
C:\ Program Files\PostgreSQL\9.3\bin> psql -fc:\ Hussein\dump\pg_test_dump.dmp -h 192.168.99.100 -p 5432 -U postgres
运行测试,测试将拧紧数据,因此我们需要重新加载,我们只需重复上述步骤.
我仍然,真的希望容器图像将数据库"放在其中"所以当我从图像运行容器时,我得到了数据库.如果有人能提出解决方案,那将会很棒,这将为我节省大量时间.
Edit4最后,Warmoverflow解决了它!答案如下
谢谢
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/
Run Code Online (Sandbox Code Playgroud)
将您的data.sql文件和Dockerfile放在一个新文件夹中,然后运行docker build -t custom_postgres .,它将为您构建一个自定义映像,每次运行新容器时,它都会在启动时加载sql文件.
[更新]
根据问题中的新信息,问题的原因是官方postgres图像VOLUME在postgres数据文件夹中定义了一个/var/lib/postgresql/data.VOLUME用于将数据保留在容器外部(当您用于docker run -v将主机文件夹安装到容器时),因此VOLUME当您提交容器本身时,不会保存其中的任何数据.虽然这通常是一个好主意,但在这种特定情况下,我们实际上需要数据不是持久性的,因此每次都可以启动具有相同数据未修改的新容器.
解决方案是创建自己的postgres图像版本,并VOLUME删除.
VOLUME从中删除该行Dockerfiledocker build -t mypostgres .,它将使用名称构建您自己的postgres图像mypostgres.docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 mypostgres来启动你的容器.postgres数据库可在以下网址找到postgres:123456@192.168.99.100:5432docker commit container_id_from_step_5 mypostgres_withdata.这将创建您自己的带有数据的postgres图像.docker rm -f container_id_from_step_5docker run -d -p 5432:5432 mypostgres_withdata以启动一个容器,并记得在之后停止或删除用过的容器,这样它就不会占用5432端口.| 归档时间: |
|
| 查看次数: |
1365 次 |
| 最近记录: |