重组docker永久卷/安装路径

时间:2020-02-12 05:52:08

标签: docker mount volumes

我使用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中,但是总是在其之前自动创建另一个(未命名)卷。它可以工作,但这并不理想,我想解决这个问题。

我只能提出两种解决方案:

  1. 使用另一个容器(例如busybox)通过--volume标志挂载pg-data,并使用子文件夹“ data”将其复制到另一个命名卷,然后使用具有更改的挂载路径的新命名卷为{ {1}}

  2. 另一个显而易见的想法是克隆Dockerfile并创建一个没有卷的新卷。

由于该卷中大约有100GB的数据,因此选项1会比较慢。选项2将意味着从现在开始维护另一个Docker映像。两种选择都有警告。是否有其他方法可用于基于新的安装路径来重组卷?

2 个答案:

答案 0 :(得分:1)

我只接受几乎空的匿名卷这一事实。

Docker提供了很多直接操作卷内容的选项,列出的选项几乎是您无需尝试操作Docker内部组件的选择。在这两个数据库中,派生PostgreSQL映像以删除其VOLUME似乎是一个巨大的持续维护问题。因此,如果您有时间和足够的磁盘空间,则一次复制卷会更好。

您还有另一个选择(偶尔值得尝试一下)是建立一个新的清洁系统。在其上安装Docker,并以所需的目录/卷布局启动PostgreSQL,但为空。现在,从备份中还原该数据库。

答案 1 :(得分:0)

这里发生的是Dockerfile正在为您创建一个匿名卷,您正在其中创建另一个名为命名卷的卷,名称为pg-data。< / p>

您只需在上一级使用命名卷即可解决问题。

pg-data:/var/lib/postgresql/data