我使用Postgres:11 docker映像已有一段时间,直到我注意到在我的持久卷装载“ pg-data”(目标:“ / var / lib / postgresql / data / pgdata”)旁边,还有另一个做docker inspect pgcontainer
时列出的未命名卷,目标:“ / var / lib / postgresql / data”:
"Mounts": [
{
"Type": "volume",
"Name": "pg-data",
"Source": "/data/docker/docker/volumes/pg-data/_data",
"Destination": "/var/lib/postgresql/data/pgdata",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "4d0ab5fd1d81b05f11805f19569e148427194ef465f0d4dc301b200b8308ada6",
"Source": "/data/docker/docker/volumes/4d0ab5fd1d81b05f11805f19569e148427194ef465f0d4dc301b200b8308ada6/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
经过进一步调查,结果发现Dockerfile本身定义了一个卷安装路径,而我正在使用docker-compose.yml覆盖它:
services:
db:
volumes:
- pg-data:/var/lib/postgresql/data/pgdata
volumes:
pg-data:
imposm-cache-data:
现在看来是嵌套卷。数据存储在卷pg-data
中,但是总是在其之前自动创建另一个(未命名)卷。它可以工作,但这并不理想,我想解决这个问题。
我只能提出两种解决方案:
使用另一个容器(例如busybox)通过--volume
标志挂载pg-data,并使用子文件夹“ data”将其复制到另一个命名卷,然后使用具有更改的挂载路径的新命名卷为{ {1}}
另一个显而易见的想法是克隆Dockerfile并创建一个没有卷的新卷。
由于该卷中大约有100GB的数据,因此选项1会比较慢。选项2将意味着从现在开始维护另一个Docker映像。两种选择都有警告。是否有其他方法可用于基于新的安装路径来重组卷?
答案 0 :(得分:1)
我只接受几乎空的匿名卷这一事实。
Docker提供了很多直接操作卷内容的选项,列出的选项几乎是您无需尝试操作Docker内部组件的选择。在这两个数据库中,派生PostgreSQL映像以删除其VOLUME
似乎是一个巨大的持续维护问题。因此,如果您有时间和足够的磁盘空间,则一次复制卷会更好。
您还有另一个选择(偶尔值得尝试一下)是建立一个新的清洁系统。在其上安装Docker,并以所需的目录/卷布局启动PostgreSQL,但为空。现在,从备份中还原该数据库。
答案 1 :(得分:0)
这里发生的是Dockerfile正在为您创建一个匿名卷,您正在其中创建另一个名为命名卷的卷,名称为pg-data。< / p>
您只需在上一级使用命名卷即可解决问题。
pg-data:/var/lib/postgresql/data