【问题标题】:Docker's behavior when mounting volumes挂载卷时 Docker 的行为
【发布时间】:2016-12-15 17:25:40
【问题描述】:

我目前正在尝试了解 Docker 如何处理卷的挂载并遇到以下行为,这对我来说似乎有点奇怪:

假设我们要将 /var/run 目录挂载到容器中(仅作为示例),我们执行以下操作:

$ docker run -i -t -v /var/run:/test ubuntu:latest /bin/bash

到目前为止,一切正常,位于 /var/run 下的所有文件夹和文件都显示在 /test 内的容器内。

现在看看如果我们决定挂载 /var 目录会发生什么:

$ docker run -i -t -v /var:/test ubuntu:latest /bin/bash

不过,/var 中的所有主机文件夹都显示在 /test 中。但是,在 cd into /test/run 之后,不会显示来自主机的文件和目录。换句话说,Docker 似乎没有对后续子目录及其内容进行“递归”挂载。这是普通的 Docker 行为吗?

【问题讨论】:

  • 我无法重现此问题,这不是预期的行为。您使用的是什么版本的 docker(以及在哪个操作系统上)?
  • 我在 Virtualbox 的 Debian Jessie VM 上运行最新的 Docker 1.12
  • 第一个命令例如使我能够在启动的容器中看到 docker.sock,而第二个仅显示 /run dir 下的容器目录。
  • 知道了。之前没抓到你。有趣...
  • 解释在这里:lists.fedoraproject.org/pipermail/devel/2011-March/150031.html(/run 现在是一个 tmpfs,并且 /var/run 已绑定到它。)我仍在探索这个话题......

标签: docker containers


【解决方案1】:

这不仅仅是普通的 Docker 行为;这是普通的 linux 行为。当您将文件系统绑定挂载到另一个目录时,如:

mkdir /tmp/mount
mount -o bind /var /tmp/mount

您只会看到目标挂载中存在的文件源文件系统中。除非您还显式绑定挂载这些目录,否则您将看不到任何子挂载中包含的文件:

mount -o bind /var/run /tmp/mount/run

这正是您在 Docker 中看到的行为,因为这与 Docker 用于在容器内公开主机目录的机制完全相同。

【讨论】:

  • 我学到了关于 Linux 的另一件事。非常感谢!
  • 有没有办法明确地让 docker 也获取这些挂载?
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2013-10-10
  • 2020-06-05
  • 2016-02-29
相关资源
最近更新 更多