生成容器

时间:2017-10-02 15:54:42

标签: postgresql docker

我使用postgres:9.5官方泊坞窗图片时出现问题。

我使用Docker在几个开发人员之间共享开发环境。我的设置包括应用程序代码的图像和数据库的另一个图像。我通过docker-compose来协调这些。我的问题在于数据库图像。

我使用postgres:9.5官方图片作为创建我的数据库映像的基础。我这样做的日常运行脚本可以执行以下操作:

# 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"

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

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

关于它为什么会发生的任何想法以及我应该如何解决这个问题(我只考虑仅限数据的容器但需要深入研究它)?

非常感谢

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

精确2:为了能够持久化和共享数据,我不使用卷,我的脚本(如上所述)设置了不同于$PGDATA默认值postgres:9.5的值。因此,数据持续存在"在创建的图像中。

精确度3:我不会覆盖ENTRYPOINTCMD,因此它会执行postgres:9.5的值。

Docker版本17.06.2-ce,构建cec0b72

1 个答案:

答案 0 :(得分:0)

postgres本身使用$PGDATA目录。

以下是您的步骤:

1。 pull和run -d postgres:9.5命名为“mydatabase”,带有自定义$ PGDATA

从postgres图像创建容器。

2。运行链接到“mydatabase”的容器,该容器填充数据库

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

3。提交并推送到注册表“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容器的默认工作方式。