一尘不染

用于持久性数据的Docker卷-仅通过容器路径就足够了吗?

docker

据我了解,Docker卷允许在Docker容器中指定将在Docker主机上共享/存储的目录/文件。例如postgres Dockerfile包含以下行

VOLUME /var/lib/postgresql/data

因此,这意味着它/var/lib/postgresql/data实际上将“存储”在主机上,并且我将可以从主机系统访问该文件。例如,当我检查pg容器时:

"Mounts": [
        {
            "Name": "4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80f",
            "Source": "/mnt/sda1/var/lib/docker/volumes/4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80f/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],

这意味着我可以在Source路径下的主机上找到卷。我想知道是什么意思4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80fSource路径。我在Docker主机上找不到具有此类ID的容器或图像。

我无法理解的一件事是,似乎当我删除容器并重新创建它时,Source路径是不同的,实际上没有数据持久存在…

因此,对于数据持久性而言,我似乎必须同时添加具有主机路径和容器路径的卷,以强制其始终将数据存储在同一路径下-这是正确的吗?


阅读 268

收藏
2020-06-17

共1个答案

一尘不染

在“ 如何列出Docker容器中的卷?”之后,我编写了一个脚本(updateDataContainerPath):

  • 要么将该路径记录在文件中(以容器命名)
  • 或者,如果该文件已经存在,将:
    • 删除Mount.Source文件夹(为空)
    • 将文件中记录的路径移动到Mount.Source路径
    • 在该文件中记录Mount.Source路径

这样,我可以删除(显然docker rm,没有-v选项)容器并重新创建它,同时将数据放入该卷中。

您可以看到gitolite/run例如中使用的脚本。

2020-06-17