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 的使用的答案似乎已经过时,或者建议我不想做的事情,即:
- 我不想在 运行 命令中使用
-v
- 我宁愿不做一个卷容器(对于我的一个小文件夹来说似乎有点过分了)
我做错了什么?任何帮助将不胜感激。
伙计们干杯。
更新: 我可以使用命名卷来保存数据,即: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" 选项将确保它们被自动删除,这对一次性容器很有用。
请耐心等待我学习如何解决 docker。我正在使用 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 进行构建是行不通的。
不太明显的是,每次执行 "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" 选项将确保它们被自动删除,这对一次性容器很有用。