Dockerfile,使用VOLUME保存数据

时间:2016-09-04 13:58:12

标签: docker dockerfile docker-volume

当我在码头工人身边学习时,请耐心等待。我正在使用v1.11.1

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

VOLUME /path/to/dir/to/persist

就足够了,但是当我使用docker run -t -i myimage:latest bash启动容器并手动添加文件exit时,我希望能够再次找到我的文件。但是当我再次运行图像时(如上所述),添加的文件不再存在。

我已经四处阅读,但答案似乎在使用VOLUMES方面过时,或建议我不愿意做的事情,这是:

  • 我不想在运行命令
  • 中使用-v
  • 我宁愿不制作一个音量容器(对于我的一个小文件夹似乎有些过分)

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

干杯。

更新:我可以使用指定的卷来保存数据,例如:docker run -v name:/path/to/persist -t -i myimage:latest bash但是使用包含VOLUME name:/path/to/persist的Dockerfile构建不起作用。

1 个答案:

答案 0 :(得分:5)

不太明显的是,每次进行“docker run”时,您都在创建一个全新的容器。然后每个新容器都有一个新的容量。

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

说明问题的示例

示例Dockerfile

FROM ubuntu
VOLUME /data

正常建造

$ 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)

如何使用数据容器

使用上一个示例中构建的相同docker镜像创建一个容器,其唯一目的是通过它的卷来保存数据

$ 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

注意:

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