postgresql这个官方Dockerfile中VOLUME有什么用

What is the use of VOLUME in this official Dockerfile of postgresql

在postgresql官方的Dockerfile中找到了如下代码。 https://github.com/docker-library/postgres/blob/master/11/Dockerfile

ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)
VOLUME /var/lib/postgresql/data

我想知道VOLUME在这方面的作用是什么。

VOLUME /var/lib/postgresql/data

据我了解,当我们启动容器时,它会创建一个新的存储卷,并且当容器被删除时,该存储卷也将被永久删除(docker stop contianerid; docker rm containeid)

那么如果数据不会持久化那么为什么要使用它。因为如果我们希望数据持久化,就会使用 VOLUME。

我的问题是 w.r.t 如果 postgres 数据只保留到容器 运行 并且之后所有内容都被清除,它有什么用。如果我做了很多工作,最后一切都消失了,那有什么用。

您对 volumes 工作原理的理解几乎是正确的,但并不完全正确。

如您所述,当您从定义 VOLUME 的图像创建容器时,docker 确实会创建一个 匿名卷 (即带有随机名称)。

当您 stop/remove 容器时,卷本身不会被删除,并且仍然可以通过 docker volume 系列命令访问。

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

总而言之,Dockerfile 中的 VOLUME 指令用于识别那些将托管持久数据并确保以下内容的位置:

  • 默认情况下,数据将在容器的生命周期内存活
  • 数据可以与其他容器共享(即--volumes-from

对我来说最重要的方面是,它还可以作为一种隐式文档供您的用户使用,让他们知道持久状态保存在哪里(这样他们就可以 name 卷通过 docker run-v 标志)。

As per my understanding it will create a new storage volume when we start a container and that storage volume will also be deleted permanently when the container is removed (docker stop contianerid; docker rm containeid)

如果您 运行 一个带有 --rm 选项的容器,匿名卷将在容器退出时被删除。如果你在创建容器的时候没有传递--rm选项,那么-v选项到docker container rm也会删除卷。否则,这些匿名卷将在 stop/rm.

后继续存在

也就是说,匿名卷很难管理,因为不清楚哪个卷包含哪些数据。特别是对于像 postgresql 这样的图像,我更希望他们从 Dockerfile 中删除 VOLUME 行,而是提供一个用名称定义卷的组合文件。您可以在我的 .

中看到更多关于 VOLUME 行的作用以及它为什么会产生问题的信息