首页 > 解决方案 > 通过卷 docker 持久存储

问题描述

读到的所有内容都在说我们可以通过VOLUME控件创建 docker 持久存储,例如herehere

但是,我有以下内容Dockerfile

VOLUME      ["/home", "/root"]

但是里面没有任何东西(我试过了touch abc,当我退出并再次进入时,文件不存在)。

我看到官方使用没有其他特殊的控制或处理,但它可以提供持久存储,即使apt-cacher-ng服务容器停止。

这怎么可能?我已经检查了以下内容,但仍然没有任何线索:

总之,如此所述:

第一种机制将为请求基于主机的持久性的容器创建一个隐式存储沙箱。...要理解的关键是,存储在沙箱中的数据不可用于其他容器,除了请求它的容器。

如何使持久存储工作?为什么我的更改每次都被擦除,而apt-cacher-ng服务容器即使停止和重新启动也可以保持其持久存储?我在这里没有看到的“其他特殊控制或治疗”是什么?

请用简单的Dockerfile(不是docker-compose.yml)解释。

标签: dockerstoragepersistencedocker-volume

解决方案


问题是,当使用 docker run 时,VOLUME 指令会创建一个外部存储,而没有针对该特定文件夹的“mount”选项。换句话说,每次为该映像创建容器时,docker 都会创建一个带有随机标签的新卷,但由于您没有为这些卷命名,因此新容器无法重用现有生成的卷。

例如

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

鉴于此 Dockerfile,如果您只是使用以下命令构建并运行此 docker 映像:

echo "There are currently $(docker volume ls | wc -l) volumes"

docker build -t my_volume_test:latest .
docker run --name another_test my_volume_test:latest

echo "There are currently $(docker volume ls | wc -l) volumes"

您会看到机器上的卷数量增加了。该容器现在使用一个卷来存储数据,但该特定卷没有名称或标签,因此它仅绑定到该特定容器。如果您删除并重新创建该容器,docker 将生成一个具有随机名称的新卷,除非您设法挂载之前创建的卷。

如果你想让它变得简单,我建议先创建卷然后挂载它。例如

docker rm -f another_test
docker volume create my-vol

docker run \
    --name another_test \
    --mount source=my-vol,target=/myvol \
    my_volume_test:latest

# alternative
docker rm -f another_test
docker run \
    --name another_test \
    -v my-vol:/myvol \
    my_volume_test:latest

在这种情况下,您可以创建和删除任意数量的容器,但它们都将使用相同的卷。

检查VOLUME 参考使用卷以获取更多信息。


推荐阅读