首页 > 解决方案 > Docker swarm 是否会忽略来自 Dockerfiles 的 VOLUME 命令?

问题描述

我们正在部署一个堆栈,compose 文件列出了两个服务:

我们看到mysql Dockerfile 有一个VOLUME指令,将数据库持久化到 Docker 卷

然而,如果我们docker stack rmdocker stack deploy编写文件,我们会丢失所有数据库内容。

这是预期的行为吗?这样做的理由是什么?

标签: dockerdocker-swarmdocker-volume

解决方案


Swarm 模式不构建 docker 镜像,因此可以肯定地说 docker swarm 忽略了 Dockerfile 的每一行。生成的图像将具有标识的卷,该卷将在容器运行时创建,无论是在集群模式内部还是外部。如果你没有在运行时指定一个卷挂载,docker 会在那个位置给你一个匿名卷,以后很难识别,并且是容器运行的节点的本地卷。使用新堆栈,不会使用之前的匿名卷,并且在各种情况下,可以自动删除匿名卷(例如,当容器配置为退出时自动删除时,我不确定它是否适用于 swarm模式)。

命名卷可以使数据更容易在单节点集群中重用。当您进入多节点集群时,您需要将这些数据移出运行容器的节点。有关如何将 NFS 之类的东西用于外部数据存储的详细信息,请参阅相关问题的答案。


推荐阅读