Docker在产卵容器时复制PGDATA文件夹

我有一个问题使用postgres:9.5官方docker的形象。

我使用Docker来共享几个开发人员之间的开发环境。 我的设置包含应用程序代码的图像和数据库的另一个图像。 我通过docker-compose编排这些东西。 我的问题是与数据库图像。

我使用postgres:9.5官方图像作为创build我的数据库映像的基础。 我用一个每天运行的脚本来做到这一点:

 # pull and run -d postgres:9.5 named "mydatabase" with custom $PGDATA # run a container linked to "mydatabase" that populates the database # commit and push to registry "mydatabase" 

这会创build一个我们可以在docker-compose.yml简单引用的图像。 问题是当容器产生时,整个$PGDATA目录被AUFS驱动程序复制到容器层。

读取文档告诉我AUFS驱动程序是这样做的,因为我的容器试图写入$PGDATA目录(Copy on Write策略)。 但是我没有看到什么可能导致这个目录的写操作。 这很烦人,因为我的数据库很大,开发人员的计算机上的磁盘空间是两倍(一个用于mydatabase映像,另一个用于生成的容器)。

任何想法,为什么会发生,我应该如何解决这个问题(我正在考虑数据的容器,但不得不挖掘更多)?

非常感谢

精度1:确实是整个$PGDATA目录被复制到容器层(甚至像PG_VERSION文件)。 因此,这不是导致AUFS写入的SQL语句。

精度2:为了能够坚持和共享数据,我不使用卷,我的脚本(上面描述)设置不同的$PGDATA值比postgres:9.5默认。 数据因此被“保存”在创build的图像中。

精度3:我不重写ENTRYPOINTCMD ,因此它是来自postgres:9.5的值被执行。

Docker版本17.06.2-ce,build cec0b72

postgres自己使用$PGDATA目录。

这些是你的步骤:

1.拉和运行-d postgres:9.5用自定义$ PGDATA命名为“mydatabase”

一个容器是从postgres图像创build的。

2.运行一个链接到“mydatabase”的容器来填充数据库

上面的容器接收填充请求,并且postgres进程将数据写入$PGDATA目录中。

3.提交并推送到registry“mydatabase”

整个容器,包括当前的$PGDATA文件夹,被保存为图像。

结论

因此,您最终的图像将具有由链接的mydatabase容器提交的基本postgres图像+数据的大小。 当你开始你的新图像时,postgres进程将开始,它将尝试读取和写入$PGDATA目录。

一个真正的考验

我已经在笔记本电脑上使用了Postgres,但是我通常在一个容器中使用它,所以最后一次是在2016年:

  docker ls -lah /usr/local/var/postgres total 96 drwx------ 25 alessandro admin 850B 28 Ago 2016 . drwxr-xr-x 8 alessandro admin 272B 21 Set 2016 .. -rw------- 1 alessandro admin 4B 18 Mag 2016 PG_VERSION drwx------ 7 alessandro admin 238B 20 Ago 2016 base drwx------ 54 alessandro admin 1,8K 28 Ago 2016 global drwx------ 3 alessandro admin 102B 18 Mag 2016 pg_clog drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_commit_ts drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_dynshmem -rw------- 1 alessandro admin 4,4K 18 Mag 2016 pg_hba.conf -rw------- 1 alessandro admin 1,6K 18 Mag 2016 pg_ident.conf drwx------ 4 alessandro admin 136B 18 Mag 2016 pg_logical drwx------ 4 alessandro admin 136B 18 Mag 2016 pg_multixact drwx------ 3 alessandro admin 102B 28 Ago 2016 pg_notify drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_replslot drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_serial drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_snapshots drwx------ 7 alessandro admin 238B 28 Ago 2016 pg_stat drwx------ 2 alessandro admin 68B 28 Ago 2016 pg_stat_tmp drwx------ 3 alessandro admin 102B 18 Mag 2016 pg_subtrans drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_tblspc drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_twophase drwx------ 5 alessandro admin 170B 9 Lug 2016 pg_xlog -rw------- 1 alessandro admin 88B 18 Mag 2016 postgresql.auto.conf -rw------- 1 alessandro admin 21K 18 Mag 2016 postgresql.conf -rw------- 1 alessandro admin 79B 28 Ago 2016 postmaster.opts 

现在我开始吧:

  docker postgres -D /usr/local/var/postgres 

并有我的本地文件夹的新状态,看看编辑时间…

  docker ls -lah /usr/local/var/postgres total 104 drwx------ 26 alessandro admin 884B 2 Ott 18:28 . drwxr-xr-x 8 alessandro admin 272B 21 Set 2016 .. -rw------- 1 alessandro admin 4B 18 Mag 2016 PG_VERSION drwx------ 7 alessandro admin 238B 20 Ago 2016 base drwx------ 53 alessandro admin 1,8K 2 Ott 18:28 global drwx------ 3 alessandro admin 102B 18 Mag 2016 pg_clog drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_commit_ts drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_dynshmem -rw------- 1 alessandro admin 4,4K 18 Mag 2016 pg_hba.conf -rw------- 1 alessandro admin 1,6K 18 Mag 2016 pg_ident.conf drwx------ 4 alessandro admin 136B 18 Mag 2016 pg_logical drwx------ 4 alessandro admin 136B 18 Mag 2016 pg_multixact drwx------ 3 alessandro admin 102B 2 Ott 18:28 pg_notify drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_replslot drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_serial drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_snapshots drwx------ 2 alessandro admin 68B 2 Ott 18:28 pg_stat drwx------ 4 alessandro admin 136B 2 Ott 18:28 pg_stat_tmp drwx------ 3 alessandro admin 102B 18 Mag 2016 pg_subtrans drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_tblspc drwx------ 2 alessandro admin 68B 18 Mag 2016 pg_twophase drwx------ 5 alessandro admin 170B 9 Lug 2016 pg_xlog -rw------- 1 alessandro admin 88B 18 Mag 2016 postgresql.auto.conf -rw------- 1 alessandro admin 21K 18 Mag 2016 postgresql.conf -rw------- 1 alessandro admin 79B 2 Ott 18:28 postmaster.opts -rw------- 1 alessandro admin 81B 2 Ott 18:28 postmaster.pid 

你说:

这很烦人,因为我的数据库很大,开发人员的计算机上的磁盘空间是两倍(一个用于mydatabase映像,另一个用于生成的容器)。

但是这是Docker容器默认的工作方式。