我有一个Dockerfile,最后说明一个卷就像这样
VOLUME /data
Run Code Online (Sandbox Code Playgroud)
现在,当我构建并运行此容器时,我确实创建并安装了一个新卷/data.
这是非常好的,但我希望能够停止此容器,然后再次运行它,并确保安装与其数据相同的卷.
我怎样才能做到这一点?
理想情况下,相同的命令会在已经存在的情况下创建卷,如果已经存在则重用它.
lar*_*sks 13
如果要将数据保留在容器的生命周期之外,则需要在容器外部创建卷.一种选择是创建"数据卷容器",如文档中所述:
docker create -v /data --name my-data busybox /bin/true
Run Code Online (Sandbox Code Playgroud)
这会创建一个容器(名为my-data).它是基于busybox图像,但因为我们使用create而不是run我们实际上没有开始任何事情.此容器仅用于向其他容器提供卷.
然后,我们可以使用--volumes-from选项来访问该卷,以便docker run在启动另一个容器时:
docker run --volumes-from my-data ...
Run Code Online (Sandbox Code Playgroud)
现在,您拥有一个在容器存在后仍然存在的卷,并且只要您的my-data容器未被删除,该卷就会一直存在.
或者,您只需/data在容器中安装主机目录,如下所示:
docker run -v /path/on/host:/data ...
Run Code Online (Sandbox Code Playgroud)
我在上面链接的文档中也描述了这个选项.
dav*_*xxx 10
larsks 的答案是在命名卷出现之前遵循的方法(或至少是解决方法)。
现在只需使用更简单和标准的命名卷。
这很好,但我希望能够停止这个容器,然后再次运行它,并确保重新安装与其数据相同的卷。
如果你stop是一个正在运行的容器(with docker stop id)然后你start它(with docker start id),则与容器关联的卷将仍然存在,而无需使用命名卷或任何技巧,因为它仍然使用相同的容器。同一图像的
不同运行 ( docker run fooImageName)之间会出现体积不持久的问题。
匿名卷和命名卷
指定卷有两种形式:匿名和命名。
如果我们不为此指定名称,则主机上的卷不能在下一个运行的容器中重用,因为它是匿名的(但通过使用两个不同的容器:一个用于应用程序,另一个用于具有匿名卷的数据,如larsks的回答)。因此,由于卷是匿名的,Docker 会在主机上为每个运行相同映像的容器创建一个新卷。
要使用命名卷,当我们运行容器时,我们只需要为安装在容器中的文件/目录添加一个名称(无论我们想要什么,它是一个逻辑名称)的前缀。
例如在 dockerfile 中声明的卷:
VOLUME /data
Run Code Online (Sandbox Code Playgroud)
我们可以这样启动容器:
docker run -v my-volume:/data myImage
Run Code Online (Sandbox Code Playgroud)
在第一次运行时,将创建卷。然后对于任何下一次运行,我们只需要指定仍然命名的卷my-volume来重用该卷。
这是文档中有趣的部分(重点是我的):
选择 -v 或 --mount 标志
...
-v或--volume:由三个字段组成,由冒号字符 (:) 分隔。字段必须按正确的顺序排列,每个字段的含义不是很明显。
- 在命名卷的情况下,第一个字段是卷的名称,并且在给定的主机上是唯一的。对于匿名卷,第一个字段被省略。
- 第二个字段是文件或目录在容器中挂载的路径。
- 第三个字段是可选的,是一个以逗号分隔的选项列表,例如 ro。
作为替代,如果由于某些原因您需要在不启动容器的情况下创建卷,您可以使用该docker volume命令。
您可以阅读卷文档:
创建和管理卷
与绑定安装不同,您可以在任何容器范围之外创建和管理卷。
创建卷:
$ docker volume create my-vol
我们会像以前一样使用它:
docker run -v my-volume:/data myImage
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6402 次 |
| 最近记录: |