我使用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:我不会覆盖ENTRYPOINT
或CMD
,因此它会执行postgres:9.5
的值。
Docker版本17.06.2-ce,构建cec0b72
答案 0 :(得分:0)
postgres本身使用$PGDATA
目录。
以下是您的步骤:
从postgres图像创建容器。
上面的容器接收填充请求,postgres进程将数据写入$PGDATA
目录。
整个容器(包括当前$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容器的默认工作方式。