是否可以在(特权(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镜像(
找到了一些有效的东西!将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的覆盖失败?
如何在docker容器内装载覆盖层:
https://gist.github.com/detunized/7c8fc4c37b49c5475e68ef9574587eee
基本上,您需要使用--privileged或更安全的--cap-add=SYS_ADMIN来运行容器。
这是一个猜测,但我怀疑这是因为docker已经在使用overlayfs,而overlayfs拒绝使用upperdir
作为另一个overlayfs。
我怀疑这可能是由于白化文件:
为了支持rm和rmdir而不更改下文件系统,覆盖文件系统需要记录在文件已删除的文件系统。这是使用白化处理完成的和不透明目录(非目录总是不透明的(。
一个白化被创建为设备号为0/0的字符设备。当在合并目录的上层发现白化时较低级别中的匹配名称将被忽略,并且白化本身也是隐藏的。
要删除下层中存在的文件,overlayfs将创建一个白化文件并隐藏所有白化文件(设备编号0,0
(。从逻辑上讲,这意味着您不能在overlayfs内创建编号为0,0
的字符设备文件,因为必须由overlayfs本身隐藏。
如果允许使用overlayfs作为upperdir
,它将无法创建封锁文件,因此也无法从较低层中rm
或rmdir
任何文件。因为它无法在另一个覆盖层上创建编号为0,0
的字符设备文件。