Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Docker在生成容器时复制PGDATA文件夹_Postgresql_Docker - Fatal编程技术网

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,构建cec0b72

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容器的默认工作方式。

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如果答案解决了你的问题,请接受我的回答