docker 容器内的 overlayfs

overlayfs inside docker container

是否可以在(特权)docker 容器中安装覆盖文件系统?至少我的直觉方法在容器外运行良好,但失败了:

> mkdir /tmp/{up,low,work,merged}
> mount -t overlay overlay -o lowerdir=/tmp/low/,upperdir=/tmp/up/,workdir=/tmp/work/ /tmp/merged/
mount: /tmp/merged: wrong fs type, bad option, bad superblock on overlay, missing codepage or helper program, or other error.

附加信息:

找到有用的东西!将 workdir 和 upperdir 挂载为 tmpfs 对我有用。 像这样:

> mkdir /tmp/overlay
> mkdir /tmp/{low,merged}
> mount -t tmpfs tmpfs /tmp/overlay
> mkdir /tmp/overlay/{up,work}
> mount -t overlay overlay -o lowerdir=/tmp/low/,upperdir=/tmp/overlay/up/,workdir=/tmp/overlay/work/ /tmp/merged/ 

我仍然对为什么在 docker 容器中创建覆盖 w/o tmpfs 失败的解释感兴趣?

如何在 docker 容器中安装 overlayfs:

https://gist.github.com/detunized/7c8fc4c37b49c5475e68ef9574587eee

基本上,您需要 运行 使用 --privileged 或更安全的 --cap-add=SYS_ADMIN.

容器

这是一个猜测,但我怀疑这是因为 docker 已经在使用 overlayfs 而 overlayfs 拒绝使用 upperdir 作为另一个 overlayfs。

我怀疑这可能是由于 whiteout files:

In order to support rm and rmdir without changing the lower filesystem, an overlay filesystem needs to record in the upper filesystem that files have been removed. This is done using whiteouts and opaque directories (non-directories are always opaque).

A whiteout is created as a character device with 0/0 device number. When a whiteout is found in the upper level of a merged directory, any matching name in the lower level is ignored, and the whiteout itself is also hidden.

要删除存在于 lowerdir 中的文件,overlayfs 将创建一个 whiteout 文件并隐藏 所有 个 whiteout 文件(设备编号 0,0)。这在逻辑上意味着您不能在 overlayfs 中创建编号为 0,0 的字符设备文件,因为 必须 被 overlayfs 本身隐藏。

如果您被允许将 overlayfs 用作 upperdir,它将无法创建中断文件,因此将无法 rmrmdir 任何来自较低层的文件。因为它不能在另一个overlayfs上创建编号为0,0的字符设备文件。