首先创建一个卷sample_vol
docker volume create sample_vol
我的Dockerfile
FROM archlinux/base
RUN touch /root/testing [**edited** find note at RUN below]
# VOLUME sample_vol:/root [**edited** this will not work, because VOLUME will not accpet named volumes. So this will not mount at /root, it will mount at sample_vol:/root which does not exist]
VOLUME "/root" or VOLUME ["/root"] [**edited** this will create a local mount volume only till the time the container is running. I tried to use named volumes like VOLUME ["name:/root"] but didnt work ]
# RUN touch /root/testing [**edited** this will not work because volume when mounted will only copy files till it got declared]
制作图片
docker build -t archlinux/sample_vol .
检查是否在sample_vol中创建了测试文件
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base ls /tmp/myvolume
它不显示已创建的任何文件测试
同时
$ docker run --rm -it --name sample_vol archlinux/sample_vol ls /root/testing
它显示文件testing
是在构建映像的/root/
中创建的
因此,为什么未将sample_vol
安装在/root
上并在其中创建testing
的原因。
更新:我找到原因可能是由于
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#volume
在Dockerfile中更改卷:如果有构建步骤 在声明后更改卷中的数据,那些 更改将被丢弃。
答案 0 :(得分:0)
您误解了docker-volume。
Docker-Image更多关于构建时间。 Docker-Volume仅在运行时有用。
尝试运行以下命令以了解主意:
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/1.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/2.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/3.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base ls -altr /tmp/myvolume/
第一个容器在挂载在/ tmp / myvolume的docker卷中创建文件1.txt,然后在执行此操作后删除容器。
第二个容器在挂载在/ tmp / myvolume的docker卷中创建文件2.txt,然后在执行此操作后删除容器。
第三个容器在挂载在/ tmp / myvolume的docker卷中创建文件3.txt,然后在执行此操作后删除容器。
挂载在/ tmp / myvolume的docker卷中的第4个容器列表文件,然后在执行此操作后删除容器。
Docker卷是在容器生命周期之外存储持久性数据,这意味着当您删除容器时,您仍然可以将数据存储在容器之外。
因此,下次如果您创建一个容器并附加该docker卷-您将自动使用新容器获取所有数据。
请考虑一个数据库映像示例,在该数据库映像中您要批量存储数据,以便在将容器更改为更高版本时-您将在新数据库中获取旧数据。