gpt4 book ai didi

postgresql - Docker 在生成容器时复制 PGDATA 文件夹

转载 作者:行者123 更新时间:2023-11-29 13:47:07 28 4
gpt4 key购买 nike

我在使用 postgres:9.5 官方 docker 镜像时遇到问题。

我使用 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 目录(写入时复制策略)。但我看不出是什么导致了对该目录的写操作。这很烦人,因为我的数据库很大并且占用了开发人员计算机上两倍的磁盘空间(一个用于 mydatabase 镜像,一个用于生成的容器)。

关于为什么会发生以及我应该如何解决这个问题的任何想法(我正在考虑纯数据容器,但必须深入研究它)?

非常感谢

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

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

精度 3:我没有覆盖 ENTRYPOINTCMD,因此执行的是来自 postgres:9.5 的值。

Docker 版本 17.06.2-ce,构建 cec0b72

最佳答案

$PGDATA 目录由 postgres 本身使用。

这些是你的步骤:

1。使用自定义 $PGDATA

拉取并运行 -d postgres:9.5 命名为“mydatabase”

容器是从 postgres 图像创建的。

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

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

3。提交并推送到注册表“mydatabase”

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

结论

因此您的最终图像将具有基本 postgres 图像的大小 + 由链接的 mydatabase 容器提交的数据。当您启动新镜像时,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

你说:

It's quite annoying because my db is big and takes twice the disk space on developers computers (one for the mydatabase image and one for the spawned container).

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

关于postgresql - Docker 在生成容器时复制 PGDATA 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46529158/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com