Dockerfile,用VOLUME保存数据

当我学习docker工人的方式时,请耐心等待。 我正在使用v1.11.1

我正在做一个Dockerfile,并且想要指定容器的一个文件夹应该被持久化,这应该只是每个用户(运行该容器的计算机)持久化。 我原本以为包括:

 VOLUME /path/to/dir/to/persist 

将是足够的,但是当我启动我的容器与docker run -t -i myimage:latest bash和手动添加文件,然后exit我希望能够再次find我的文件。 但是当我再次运行图像时(如上所述),添加的文件不再存在。

我已经阅读过,但是对于VOLUMES的使用看来或者是过时的,或者build议我不想做的事情,那就是:

  • 我不想在运行命令中使用-v
  • 我宁愿不制作卷容器(似乎对我的一个小文件夹矫枉过正)

我做错了什么? 任何帮助将不胜感激。

干杯。

更新:我可以使用命名卷持久化数据,即: docker run -v name:/path/to/persist -t -i myimage:latest bash但是使用包含VOLUME name:/path/to/persist的Dockerfile构buildVOLUME name:/path/to/persist工作。

不是很明显的是,你每次做“docker运行”时都会创build一个全新的容器。 每个新的容器将有一个新的卷。

所以你的数据被持久化了,但是你没有从你写的容器中读取数据。

举例说明问题

示例Dockerfile

 FROM ubuntu VOLUME /data 

正常build造

 $ docker build . -t myimage Sending build context to Docker daemon 2.048 kB Step 1 : FROM ubuntu ---> bd3d4369aebc Step 2 : VOLUME /data ---> Running in db84d80841de ---> 7c94335543b8 

现在运行两次

 $ docker run -ti myimage echo hello world $ docker run -ti myimage echo hello world 

并看看卷

 $ docker volume ls DRIVER VOLUME NAME local 078820609d31f814cd5704cf419c3f579af30672411c476c4972a4aad3a3916c local cad0604d02467a02f2148a77992b1429bb655dba8137351d392b77a25f30192b 

“docker rm”命令有一个特殊的“-v”选项,将清除与容器相关的任何卷。

 $ docker rm -v $(docker ps -qa) 

如何使用数据容器

使用前面示例中构build的同一个Docker镜像创build一个容器,其唯一目的是通过容量保存数据

 $ docker create --name mydata myimage 

启动另一个容器,将一些数据保存到“/ data”卷中

 $ docker run -it --rm --volumes-from mydata myimage bash root@a1227abdc212:/# echo hello world > /data/helloworld.txt root@a1227abdc212:/# exit 

启动第二个容器来检索数据

 $ docker run -it --rm --volumes-from mydata myimage cat /data/helloworld.txt hello world 

清理,只需删除容器,并指定“-v”选项,以确保其体积被清理。

 $ docker rm -v mydata 

笔记:

  • “volume-from”参数表示所有数据都被保存到与“mydata”容器关联的基础卷中
  • 当运行容器时,“rm”选项将确保它们被自动移除,对于一次性容器是有用的。