Postgresql Docker在生成容器时复制PGDATA文件夹
我在使用Postgresql Docker在生成容器时复制PGDATA文件夹,postgresql,docker,Postgresql,Docker,我在使用postgres:9.5docker官方图像时遇到问题 我使用Docker在几个开发人员之间共享一个开发环境。我的设置由应用程序代码的图像和数据库的图像组成。我通过docker compose编排这些。我的问题是数据库映像 我正在使用postgres:9.5official image作为创建数据库映像的基础。我通过一个每日运行的脚本来实现这一点,该脚本执行以下操作: # pull and run -d postgres:9.5 named "mydatabase" with custo
postgres:9.5
docker官方图像时遇到问题
我使用Docker在几个开发人员之间共享一个开发环境。我的设置由应用程序代码的图像和数据库的图像组成。我通过docker compose编排这些。我的问题是数据库映像
我正在使用postgres:9.5
official image作为创建数据库映像的基础。我通过一个每日运行的脚本来实现这一点,该脚本执行以下操作:
# 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
目录(写时复制策略)。但我看不出是什么导致了这个目录上的写操作。这很烦人,因为我的数据库很大,占用开发者计算机上两倍的磁盘空间(一个用于mydatabase映像,一个用于生成的容器)
关于为什么会发生这种情况以及我应该如何解决这个问题(我正在考虑只使用数据的容器,但必须深入研究它)有什么想法吗
非常感谢
精度1:实际上是整个$PGDATA
目录被复制到容器层(甚至像PG_版本这样的文件)。因此,导致AUFS写入的不是SQL语句
精度2:为了能够持久化和共享数据,我不使用卷,我的脚本(如上所述)设置的值与postgres:9.5
默认值不同。因此,数据被“持久化”到创建的图像中
精度3:我不重写入口点
或CMD
,因此执行的是postgres:9.5
中的值
Docker版本17.06.2-ce,构建cec0b72postgres本身使用
$PGDATA
目录
以下是您的步骤:
1.拉并运行-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容器的默认工作方式。postgres本身使用
$PGDATA
目录
以下是您的步骤:
1.拉并运行-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容器的默认工作方式。感谢您花时间回答。从doc():
启动容器时,会在其他层的顶部添加一个薄的可写容器层。容器对文件系统所做的任何更改都存储在这里。容器未更改的任何文件都不会复制到此可写层…
意味着我的PGDATA目录是以某种方式写入的,但这不是容器的默认方式works@htulipe如果答案解决了你的问题,请接受它。所以未来的游客可以认出它。你试过吗?嗨@lifeisfoo,答案不能解决我的问题对不起。我的主要问题是,在生成容器时,整个PGDATA文件夹被复制(磁盘空间使用率成倍增加)。从您的回答中,我可以看到您的postgres实例也编写了PGDATA文件夹(查看
的mtime),但我不知道为什么也不知道如何避免它。不管怎样,我最终使用了Docker卷解决了磁盘空间问题。感谢您花时间回答。从doc():启动容器时,会在其他层的顶部添加一个薄的可写容器层。容器对文件系统所做的任何更改都存储在这里。容器未更改的任何文件都不会复制到此可写层…
意味着我的PGDATA目录是以某种方式写入的,但这不是容器的默认方式works@htulipe如果答案解决了你的问题,请接受我的回答