首页 > 解决方案 > postgresql的这个官方Dockerfile中的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 数据只会保留到容器运行,然后一切都被清除,那么它的用途是什么。如果我做了很多工作,最后一切都消失了,那还有什么用。

标签: dockerdocker-volume

解决方案


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

如果您使用该--rm选项运行容器,则在容器退出时会删除匿名卷。--rm如果您在创建容器时没有传递该选项,那么该-v选项docker container rm也会删除卷。否则,这些匿名卷将在停止/rm 之后持续存在。

也就是说,匿名卷很难管理,因为不清楚哪个卷包含哪些数据。特别是对于像 postgresql 这样的图像,我希望他们VOLUME从 Dockerfile 中删除该行,而是提供一个用名称定义卷的 compose 文件。您可以在我的回答中看到更多关于这VOLUME条线的作用以及它为什么会产生问题的信息。


推荐阅读