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
行的作用以及它为什么会产生问题的信息
在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
行的作用以及它为什么会产生问题的信息