重构 docker 持久卷/挂载路径

Restructure docker persistent volume / mount path

我使用 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" 的命名卷,然后使用新的命名卷将安装路径更改为 /var/lib/postgresql/data

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

由于该卷中包含大约 100GB 的数据,因此选项 1 会有点慢。选项 2 意味着从现在开始维护另一个 Docker 图像。两个选项都有警告。是否有任何其他方法可用于根据新的装载路径重组卷?

这里发生的事情是 Dockerfile 正在为您创建一个 匿名卷 而您正在其中创建另一个作为 命名卷 名称为 pg-data.

您可以简单地使用上一级的命名卷,它应该可以解决您的问题。

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

我只能接受匿名卷几乎为空的事实。

Docker 为您提供了相当少的选项来直接操作卷的内容,并且您列出的选项几乎是您在不尝试操作 Docker 内部时所拥有的选择。在这两者中,分叉 PostgreSQL 映像以删除其 VOLUME 似乎是一个巨大的持续维护问题。所以如果有时间和盘space,一次性卷拷贝比较好

您的另一个选择(可能值得偶尔尝试)是建立一个新的干净系统。在其上安装 Docker,然后使用您想要的 directory/volume 布局启动 PostgreSQL,但为空。现在从备份恢复这个数据库。