【问题标题】:Restructure docker persistent volume / mount path重构 docker 持久卷/挂载路径
【发布时间】:2020-05-27 15:11:52
【问题描述】:

我使用 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 映像。两个选项都有警告。是否有任何其他方法可用于根据新的挂载路径重构卷?

【问题讨论】:

    标签: docker mount volumes


    【解决方案1】:

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

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

    您拥有的另一个选择(可能值得偶尔尝试一下)是建立一个新的干净系统。在其上安装 Docker,并使用所需的目录/卷布局启动 PostgreSQL,但为空。现在从备份中恢复这个数据库。

    【讨论】:

    • 谢谢,是的,我正在考虑将其保留原样,并在我们使用docker system prunedocker volume prune 进行系统重置后升级音量设置。幸运的是,这种情况偶尔会发生。然而,在运行多年的生产系统中,这不是一个选择。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我知道,但是如果我想保留该命名卷中的数据怎么办?然后我将不得不以某种方式修改命名卷中的结构(因为 postgres 期望它的数据在子文件夹./data/pgdata 中并且命名卷不包含pgdata,因为这是之前的挂载点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2023-03-08
    • 2017-07-21
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多