PostgreSQL的官方Dockerfile中的VOLUME有什么用

时间:2019-04-04 08:34:56

标签: docker docker-volume

我在官方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。

我的问题是,如果postgres数据仅保留到容器运行,然后清除所有内容,它的用途是什么。如果我做了很多工作,最后一切都消失了,那有什么用。

2 个答案:

答案 0 :(得分:1)

  

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

如果使用--rm选项运行容器,则在容器退出时匿名卷将被删除。如果在创建容器时未通过--rm选项,则-v的{​​{1}}选项也会删除卷。否则,这些匿名卷将在stop / rm之后继续存在。

也就是说,匿名卷很难管理,因为尚不清楚哪个卷包含哪些数据。特别是对于类似postgresql的图像,如果它们从其Dockerfile中删除了docker container rm行,而是提供了一个使用名称定义卷的撰写文件,我希望这样做。您可以在answer over here上看到更多有关VOLUME行的内容以及为什么会产生问题的信息。

答案 1 :(得分:0)

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

正如您所说,当您通过定义VOLUME的映像创建容器时,docker确实会创建一个匿名卷(即,具有随机名称)。

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

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

因此,对Dockerfile中的VOLUME指令进行总结,可用于标识将托管持久数据的位置,并确保以下各项:

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

对我来说最重要的方面是,它还可以作为一种隐式文档,供您的用户告知他们保持持久状态的位置(以便他们可以通过以下方式命名-v的{​​{1}}标志)。