我在官方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数据仅保留到容器运行,然后清除所有内容,它的用途是什么。如果我做了很多工作,最后一切都消失了,那有什么用。
答案 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}}标志)。