我们正在部署堆栈,撰写文件列出了两项服务:
我们看到mysql Dockerfile has a
VOLUME
directive将数据库持久化到Docker卷但是,如果我们对compose文件进行
docker stack rm
然后docker stack deploy
编码,则会丢失所有数据库内容。那是预期的行为吗?这样做的理由是什么?
最佳答案
Swarm模式不会生成Docker镜像,因此可以肯定地说docker swarm会忽略Dockerfile的每一行。生成的图像将具有标识的体积,该体积将在容器运行时创建,无论是在群集模式内部还是外部。如果您未在运行时指定卷装载,则docker将在该位置为您提供一个匿名卷,该卷稍后将难以识别,并且位于运行容器的节点的本地。使用新堆栈时,将不使用以前的匿名卷,并且在各种情况下,可以自动删除匿名卷(例如,当容器配置为在退出时自动删除时,我不确定它是否适用于swarm模式)。
命名卷可以使数据更易于在单个节点群集中重用。进入多节点群集时,需要将此数据移出容器运行所在的节点。有关如何使用NFS之类的东西进行外部数据存储的详细信息,请参阅this answer到相关问题。
关于docker - Docker群是否会忽略Dockerfile中的VOLUME命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56151262/