postgresql的官方Dockerfile中的卷有什么用途

postgresql的官方Dockerfile中的卷有什么用途,docker,docker-volume,Docker,Docker Volume,我在官方postgresql的Dockerfile中找到了以下代码 我想知道在这方面,卷的目的是什么 VOLUME /var/lib/postgresql/data 据我所知,当我们启动一个容器时,它将创建一个新的存储卷,当容器被移除时,该存储卷也将被永久删除docker stop contianerid;码头工人 那么,如果数据不会持久化,那么为什么要使用它呢。因为如果我们想要数据持久化,就要使用卷 我的问题是w.r.t如果postgres数据只会一直保留到容器运行,然后所有内容都会被删除,

我在官方postgresql的Dockerfile中找到了以下代码

我想知道在这方面,卷的目的是什么

VOLUME /var/lib/postgresql/data
据我所知,当我们启动一个容器时,它将创建一个新的存储卷,当容器被移除时,该存储卷也将被永久删除docker stop contianerid;码头工人

那么,如果数据不会持久化,那么为什么要使用它呢。因为如果我们想要数据持久化,就要使用卷

我的问题是w.r.t如果postgres数据只会一直保留到容器运行,然后所有内容都会被删除,那么它有什么用呢。如果我做了很多工作,但最后一切都没有了,那又有什么用。

你对卷如何工作的理解几乎是正确的,但并不完全正确

如您所述,当您从定义卷的映像创建容器时,docker确实会创建一个匿名卷,即使用随机名称

当您停止/删除容器时,卷本身不会被删除,docker volume系列命令仍可访问该卷

实际上,为了删除容器并删除相关卷,您必须使用docker rm-v容器名称中的-v标志。此命令将删除容器并删除与其关联的所有匿名卷命名卷将永远不会被删除,除非通过docker volume rm volume name明确请求

因此,总结一下,Dockerfile中的VOLUME指令用于标识将承载持久性数据的位置,并确保:

默认情况下,数据将在容器的有效期内保存 数据可以与其他容器共享,即来自 对我来说,最重要的一点是,它还可以作为一种隐式文档,让用户知道持久状态保存在哪里,以便他们可以通过docker run的-v标志命名卷

据我所知,当我们启动一个容器时,它将创建一个新的存储卷,当容器被移除时,该存储卷也将被永久删除docker stop contianerid;码头工人

如果使用-rm选项运行容器,则当容器退出时,将删除匿名卷。如果在创建容器时未传递-rm选项,则docker container rm的-v选项也将删除卷。否则,这些匿名卷将在停止/rm后继续存在


也就是说,匿名卷很难管理,因为不清楚哪个卷包含哪些数据。特别是对于像postgresql这样的图像,我更希望它们从Dockerfile中删除卷行,而是提供一个用名称定义卷的撰写文件。您可以了解有关卷线的作用以及卷线在my中产生问题的原因的更多信息。

您想阅读可能重复的“我要求w.r.t实现数据持久性”。因为这将是暂时的。我想知道它的用法。这与挂载不同,因为在挂载过程中,它被理解,但在本例中,它只是创建一个具有哈希名称的卷,然后在移除容器后将其删除。您是对的,每当我使用-rm运行时,容器停止后该卷会立即被删除。但是我没有像-d或者没有-rm那样尝试过其他方法。但是正如你提到的,即使它们存在,也很难通过它们的随机名称来理解它们是什么。对我来说,最重要的一点是,它还可以作为一种隐式文档,让用户知道持久状态保存在哪里,以便他们可以通过docker run的-v标志来命名卷。间接地,这也是一个很好的理由-当然,有时也会有很多。默认情况下,数据将在容器的生命周期内生存:即使该卷仍然存在,但正如@BMitch所述,匿名卷很难管理,因为不清楚哪个卷包含哪些数据。总之,我之所以感到困惑,主要是因为我使用-rm运行容器。当容器停止时,卷总是被删除。
VOLUME /var/lib/postgresql/data