Dockerfile,使用 VOLUME 持久化数据

Dockerfile, persist data with VOLUME

请耐心等待我学习如何解决 docker。我正在使用 v1.11.1

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

VOLUME /path/to/dir/to/persist

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

我已经阅读过,但关于 VOLUMES 的使用的答案似乎已经过时,或者建议我不想做的事情,即:

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

伙计们干杯。

更新: 我可以使用命名卷来保存数据,即:docker run -v name:/path/to/persist -t -i myimage:latest bash 但是使用包含 VOLUME name:/path/to/persist 的 Dockerfile 进行构建是行不通的。

不太明显的是,每次执行 "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" 选项将确保它们被自动删除,这对一次性容器很有用。