重构 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
中,但总是在它之前自动创建另一个(未命名的)卷。它有效,但这并不理想,我想解决这个问题。
我只能想出两个办法:
使用另一个容器(例如 busybox)挂载带有 --volume
标志的 pg-data 并复制到另一个带有子文件夹 "data" 的命名卷,然后使用新的命名卷将安装路径更改为 /var/lib/postgresql/data
另一个明显的想法是克隆 Dockerfile 并创建一个没有卷的新的。
由于该卷中包含大约 100GB 的数据,因此选项 1 会有点慢。选项 2 意味着从现在开始维护另一个 Docker 图像。两个选项都有警告。是否有任何其他方法可用于根据新的装载路径重组卷?
这里发生的事情是 Dockerfile 正在为您创建一个 匿名卷 而您正在其中创建另一个作为 命名卷 名称为 pg-data.
您可以简单地使用上一级的命名卷,它应该可以解决您的问题。
pg-data:/var/lib/postgresql/data
我只能接受匿名卷几乎为空的事实。
Docker 为您提供了相当少的选项来直接操作卷的内容,并且您列出的选项几乎是您在不尝试操作 Docker 内部时所拥有的选择。在这两者中,分叉 PostgreSQL 映像以删除其 VOLUME
似乎是一个巨大的持续维护问题。所以如果有时间和盘space,一次性卷拷贝比较好
您的另一个选择(可能值得偶尔尝试)是建立一个新的干净系统。在其上安装 Docker,然后使用您想要的 directory/volume 布局启动 PostgreSQL,但为空。现在从备份恢复这个数据库。
我使用 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" 的命名卷,然后使用新的命名卷将安装路径更改为/var/lib/postgresql/data
另一个明显的想法是克隆 Dockerfile 并创建一个没有卷的新的。
由于该卷中包含大约 100GB 的数据,因此选项 1 会有点慢。选项 2 意味着从现在开始维护另一个 Docker 图像。两个选项都有警告。是否有任何其他方法可用于根据新的装载路径重组卷?
这里发生的事情是 Dockerfile 正在为您创建一个 匿名卷 而您正在其中创建另一个作为 命名卷 名称为 pg-data.
您可以简单地使用上一级的命名卷,它应该可以解决您的问题。
pg-data:/var/lib/postgresql/data
我只能接受匿名卷几乎为空的事实。
Docker 为您提供了相当少的选项来直接操作卷的内容,并且您列出的选项几乎是您在不尝试操作 Docker 内部时所拥有的选择。在这两者中,分叉 PostgreSQL 映像以删除其 VOLUME
似乎是一个巨大的持续维护问题。所以如果有时间和盘space,一次性卷拷贝比较好
您的另一个选择(可能值得偶尔尝试)是建立一个新的干净系统。在其上安装 Docker,然后使用您想要的 directory/volume 布局启动 PostgreSQL,但为空。现在从备份恢复这个数据库。