[所有阅读的内容都是说我们可以通过VOLUME
控件,例如here和here创建docker持久性存储。
但是,我的Dockerfile
中有以下内容:
VOLUME ["/home", "/root"]
但没有任何内容保留在其中(我尝试了touch abc
,当我退出并再次返回时,文件不在此处)。
[我看到official usage没有其他特殊控件或处理方法,但是即使apt-cacher-ng
服务容器已停止,它也可以提供持久存储。
这怎么可能?我已经检查了以下内容,但仍然没有任何线索:
我如何使它起作用?
请以简单的Dockerfile
(而不是docker-compose.yml
解释)。
问题是,使用docker run时,VOLUME指令创建了一个外部存储,而该文件夹没有“ mount”选项。换句话说,每当您为该映像创建一个容器时,docker都会创建一个带有随机标签的新卷,但是由于您没有为这些卷命名,因此新容器无法重用现有的已生成卷。
例如
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
给出此Dockerfile,如果您仅使用以下命令构建并运行此Docker映像:
docker volume ls
docker build -t my_volume_test:latest .
docker run --name another_test my_volume_test:latest
docker volume ls
您将看到计算机上存在的卷数量增加了。该容器现在正在使用卷来存储数据,但是该特定卷没有名称或标签,因此仅绑定到该特定容器。如果删除并重新创建该容器,除非您设法挂载先前创建的卷,否则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 reference和Use volumes了解更多信息。