3

是否可以在(特权)docker 容器中安装覆盖 fs?至少我的直观方法(在容器外运行良好)失败了:

> 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.

附加信息:

  • Docker 版本 18.09.1,构建 4c52b90
  • 内核 4.19.0-8-amd64
  • Debian 10(主机和 docker-image)
4

3 回答 3

3

找到了有用的东西!将 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 容器中创建不带 tmpfs 的覆盖失败?

于 2021-04-22T07:33:24.280 回答
2

如何在 docker 容器中挂载 overlayfs:

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

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

于 2021-07-02T06:39:10.470 回答
1

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

我怀疑这可能是由于白文件

为了在不改变下层文件系统的情况下支持 rm 和 rmdir,覆盖文件系统需要在上层文件系统中记录文件已被删除。这是使用白化和不透明目录完成的(非目录总是不透明的)。

whiteout 创建为具有 0/0 设备号的字符设备。当在合并目录的上层中发现 whiteout 时,将忽略下层中的任何匹配名称,并且 whiteout 本身也被隐藏。

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

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

于 2022-02-08T12:30:18.550 回答