docker - Docker swarm 是否会忽略来自 Dockerfiles 的 VOLUME 命令?
问题描述
我们正在部署一个堆栈,compose 文件列出了两个服务:
- 媒体维基
- MYSQL
我们看到mysql Dockerfile 有一个VOLUME
指令,将数据库持久化到 Docker 卷
然而,如果我们docker stack rm
再docker stack deploy
编写文件,我们会丢失所有数据库内容。
这是预期的行为吗?这样做的理由是什么?
解决方案
Swarm 模式不构建 docker 镜像,因此可以肯定地说 docker swarm 忽略了 Dockerfile 的每一行。生成的图像将具有标识的卷,该卷将在容器运行时创建,无论是在集群模式内部还是外部。如果你没有在运行时指定一个卷挂载,docker 会在那个位置给你一个匿名卷,以后很难识别,并且是容器运行的节点的本地卷。使用新堆栈,不会使用之前的匿名卷,并且在各种情况下,可以自动删除匿名卷(例如,当容器配置为退出时自动删除时,我不确定它是否适用于 swarm模式)。
命名卷可以使数据更容易在单节点集群中重用。当您进入多节点集群时,您需要将这些数据移出运行容器的节点。有关如何将 NFS 之类的东西用于外部数据存储的详细信息,请参阅相关问题的答案。
推荐阅读
- php - 将数组中的所有 url 路径与 preg_match_all 匹配
- node.js - puppeteer 无法安装:错误:无法设置 Chromium r782078!设置“PUPPETEER_SKIP_DOWNLOAD”环境变量以跳过下载
- arrays - 在 Perl 中复制数组的次数
- java - 如何将源附加到可在 eclipse 外部依赖项中使用的 Gradle (Gradle 6.3.) 构建中的 jar
- java - spring jpa @version 在事务未提交之前自动更新版本
- sql - 在sql中按行显示列值
- reactjs - Jest/Enzyme ReactJS 测试表单控制选项
- mongodb - 有人可以解释这个 MongoClient.connect 代码是如何工作的吗?
- javascript - 将 Angular 应用程序从 6 升级到 10 更新后会产生很多错误
- django - 为什么我在 Django 中不断收到“列 _id 不存在”错误?