- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
首先,我想明确表示我在研究这个主题时已经做了尽职调查。密切相关的是this SO question ,这并没有真正解决我的困惑。
我了解,当在 Dockerfile 中指定 VOLUME
时,这会指示 Docker 在容器的持续时间内创建一个未命名的卷,该卷映射到其中的指定目录。例如:
# Dockerfile
VOLUME ["/foo"]
这将创建一个卷来包含存储在容器内的 /foo
中的任何数据。卷(通过 docker volume ls
查看时)将显示为随机的数字。
每次执行 docker run
时,都不会重复使用此卷。这是造成困惑的关键点。对我来说,卷的目标是在图像的所有实例中包含持久的状态(所有容器都从它开始)。所以基本上如果我这样做,没有明确的卷映射:
#!/usr/bin/env bash
# Run container for the first time
docker run -t foo
# Kill the container and re-run it again. Note that the previous
# volume would now contain data because services running in `foo`
# would have written data to that volume.
docker container stop foo
docker container rm foo
# Run container a second time
docker run -t foo
我希望在 2 个 run
命令之间重复使用未命名的卷。然而,这种情况并非如此。因为我没有通过 -v
选项显式映射卷,所以为每个 run
创建一个新卷。
这是重要的第 2 部分:由于我需要明确指定 -v
以在 run
命令之间共享持久状态,我为什么要指定 VOLUME
在我的 Dockerfile 中?如果没有 VOLUME
,我可以这样做(使用前面的示例):
#!/usr/bin/env bash
# Create a volume for state persistence
docker volume create foo_data
# Run container for the first time
docker run -t -v foo_data:/foo foo
# Kill the container and re-run it again. Note that the previous
# volume would now contain data because services running in `foo`
# would have written data to that volume.
docker container stop foo
docker container rm foo
# Run container a second time
docker run -t -v foo_data:/foo foo
现在,确实,第二个容器会将数据挂载到上一个实例的 /foo
中。我可以在我的 Dockerfile 中不使用 VOLUME
来做到这一点。通过命令行,我可以将容器内的任何目录转换为挂载到主机上的绑定(bind)目录或 Docker 中的卷。
所以我的问题是:当您必须通过主机上的命令将命名卷显式映射到容器时,VOLUME
的意义何在?要么我遗漏了一些东西,要么这只是令人困惑和混淆。
请注意,我在这里的所有断言都是基于我对 docker 行为方式的观察,以及我从文档中收集到的内容。
最佳答案
VOLUME
和 EXPOSE
之类的指令有点不合时宜。我们今天所知道的命名卷是在 Docker 1.9 中引入的。 ,大约三年前。
在 Docker 1.9 之前,运行一个容器,其镜像具有一个或多个 VOLUME
指令(或使用 --volume
选项)是为数据创建卷的唯一方法分享或坚持。事实上,过去的最佳实践是创建仅用于保存一个或多个卷的纯数据容器,然后使用 --volumes-from
与您的应用程序容器共享这些卷选项。这里有一些文章描述了这种过时的模式。
另外,请查看 moby/moby#17798 (Data-only containers obsolete with docker 1.9.0?)讨论了从纯数据容器到命名卷的变化。
今天,我认为 VOLUME
指令是一种高级工具,应该只用于特殊情况,并且经过深思熟虑。例如,官方 postgres 镜像声明了 VOLUME
at /var/lib/postgresql/data
.这可以通过将数据库数据保留在分层文件系统之外来提高开箱即用的 postgres 容器的性能。 Docker 不必在容器镜像的所有层中搜索 /var/lib/postgresql/data
处的文件请求。
但是,VOLUME
指令确实是有代价的。
后一个问题会导致类似的问题。
对于 GitLab 问题,有人想使用预配置的数据扩展 GitLab 镜像以进行测试,但由于 VOLUME at /var/opt/gitlab 的原因,不可能在下游镜像中提交该数据。在父图像中。
tl;dr:VOLUME
是为 Docker 1.9 之前的世界而设计的。最好别管它。
关于docker - Dockerfile 中 VOLUME 的实际用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52570093/
docker volume 命令中使用的两个标志之间的确切区别是什么 -v和 --volumes-from .在我看来,他们正在做同样的工作,请考虑以下场景。 首先让我们创建一个名为 myvol 的卷
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在尝试创建一个 docker 容器,该容器具有一个应包含多个文件夹的外部卷,因此我的 Dockerfile 简化版本如下所示: FROM ubuntu:12.04 # Create a volum
我正在使用打开 Kubernetes 选项的 docker 应用程序运行 mac OSX Catalina。我使用以下 yaml 和命令创建了一个 PersistentVolume。 apiVersi
我看到了 docker-compose 模式,但我很困惑。制作组合容器的最佳方法是什么。什么时候应该使用 link 或 volumes_from。我什么时候应该使用 volumes_from, vol
我对创建 docker volume create my-vol 之间的区别感到困惑。和 VOLUME ["/var/www"] . 我的理解是: 1) docker volume create my
要在 Kubernetes POD 中使用存储,我可以使用 volumes和 persistent volumes .而卷像emptyDir是短暂的,我可以使用 hostPath以及许多其他基于云的卷
使用 btrfs 驱动程序在 RHEL 7.1 上运行 docker v1.10.1。我有一个单独的 xfs 分区,我想在其中挂载数据卷。我宁愿让 docker 本地管理卷(即使用 docker vo
我想在我的 docker-compose 文件中设置一个标志,如果我不需要我的数据库卷是否不会在容器外持久化,但我仍然想要一个卷条目,如果我的数据库很小那么我不希望它执着于外。 最佳答案 您可以使用两
我是 Kubernetes 的新手,我很难理解 Kubernetes 中持久存储背后的整个想法。 这就足够了吗,或者我必须创建持久卷,如果我只部署这两个对象而不创建 PV 会发生什么情况? 存储应该在
我正在研究 kubeflow 管道以及管道的不同组件如何相互链接。为此,我使用了官方 GitHub 存储库中提供的 MNIST 项目示例。但我无法理解以下代码片段中 vop.volume 和 mnis
我正在尝试设置 Dockerfile将我的主机目录挂载到我指定的 docker 容器目录(因此代码更改将立即反射(reflect)出来)。当我运行 docker run -p 3000:3000 -d
我有一个使用 docker-compose 在 Ubuntu 服务器上运行的 Jira 实例。 我最初通过将 jira 安装文件夹映射到名为 jiravolume 的 docker 卷来设置它。 vo
如何检测在 iOS/Android 上是否按下了 + 或 - 按钮? 最佳答案 我认为它对 iOS 有帮助.. - (void)viewWillAppear:(BOOL)animated {
我是 Docker 的新手。我在 Windows 10 企业版 上运行,并尝试将在 Windows 上运行的现有应用容器化(因此它是一个 Windows 容器)。我不知道这是否重要,但容器相当大 (8
我已经断断续续地搜索文档、邮件列表几天了,但似乎找不到答案。 我有一个 OS X 应用程序,除其他外,它可以使用 kAudioDevicePropertyVolumeScalar 等查询可用的硬件设备
了解了docker(在Ubuntu 18.04 LTE(仿生)上),特别是关于管理持久数据的知识,我发现docker volumes。 按照那里的示例,我尝试将一些文件添加到卷中,然后从容器中列出它们
在这段代码中,如果Volume>10mil,我开始将体积添加到Cumulative Volume,我们在蜡烛下面创建一条线,一直延伸到当前条,因此Volume>10mil,我们创建一条线,Cumvol
这个问题在这里已经有了答案: Kubernetes NFS Persistent Volumes - multiple claims on same volume? Claim stuck in p
使用 docker-compose synthax v2,我们能够做这样的事情: version: '2' services: app: image: tianon/true vo
我是一名优秀的程序员,十分优秀!