所有读到的内容都说,我们可以通过VOLUME控件(例如,这里和这里 )创建docker持久存储。
但是,我的Dockerfile中有以下内容
VOLUME ["/home", "/root"]但是里面没有保存任何东西(我尝试了touch abc,当我退出并再次返回时,文件就不在了)。
我看到官方使用没有其他特殊的控制或处理方法,但是它可以提供持久存储,甚至停止apt-cacher-ng服务容器。
那件事怎么可能?我已经检查了以下内容,但仍然没有头绪:
最后,正如解释的那样,这里
第一种机制将为请求基于主机的持久性的容器创建一个隐式存储沙箱。..。需要理解的关键是,沙箱中存储的数据除请求的容器外,其他容器不可用。
如何使持久存储工作?为什么每次删除我的更改,而apt-cacher-ng服务容器即使停止并重新启动也可以维护其持久存储?我在这里没有看到的“其他特殊控制或治疗”是什么?
请用简单的Dockerfile (而不是docker-compose.yml )解释。
发布于 2020-03-31 08:28:05
问题是,当没有针对特定文件夹的“挂载”选项而使用停靠程序运行时,卷指令会创建外部存储。换句话说,每次您为该映像创建容器时,对接者都会创建一个带有随机标签的新卷,但是由于您没有给这些卷命名,新容器不能重用现有生成的卷。
例如:
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 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在这种情况下,您可以创建和删除任意数量的容器,但它们都将使用相同的卷。
https://stackoverflow.com/questions/60943270
复制相似问题