我在 Docker 中启用了用户命名空间,试图(我认为)将任何容器使用的任何用户分配给特定的用户。
该用户已被docker创建,并且subuid和subgid中的条目已创建:
dockremap:362144:65536
虽然dockremap
它本身的 ID 为 116,
我希望现在可以将主机中的任何文件绑定到容器,并且只要该文件由dockremap
主机拥有或权限足够开放,容器就能够读取它。与目录相同。
相反,我发现自己必须让某个用户成为文件/文件夹的所有者362144
(这意味着主机上什么都没有,所以ls
、ps
等......只显示数字 ID)。
预计会像这样工作吗?因为我做错了,或者从管理的角度来看,这是一场噩梦。
是的,预计会像这样工作。该
subuid
文件并不意味着任何内容都会映射到您的帐户 - 恰恰相反,它保留了一系列免费的“真实”UID 专门供您的容器使用,这样它们就不会与真实系统帐户或其他运行的容器重叠用户。Linux 用户命名空间 ID 映射始终为 1:1;一个范围只能映射到另一个相同大小的范围。这是因为 UID 映射必须在两个方向上发挥作用 - 不仅在为新创建的文件分配真实的 UID 时,而且在确定在现有文件的容器内显示哪个所有者时。
例如,给定您拥有的 1:1 映射,容器的 UID 1000 拥有的文件将被存储为 363144 作为其真正所有者,这样当容器再次启动并检索信息时,可以转换主机的 363144回到容器的 1000。
如果映射不是 1:1(例如,如果所有容器 UID 都映射到同一主机 UID),则哪个容器用户拥有哪个容器文件的信息将会丢失。(理论上,容器所有者可以存储在 xattrs 中,但 Linux 本身并不这样做。我听说 Docker 在 macOS 上使用自己的 FUSE 层执行此操作,并且我怀疑它可能会使用 fusion-overlayfs 来实现此目的Linux,但我从未使用过 Docker 到那种程度,所以我不确定。)
使用最新的 Linux 内核,还可以将 UID 映射应用于挂载,而不仅仅是用户命名空间,因此理论上容器引擎可以被告知将目录绑定挂载到容器中,同时将容器的 UID 1000 映射到主机的 UID 1000,或者类似的东西。我在 systemd-nspawn 中看到了这个选项,但同样,我不知道在 Docker 中哪里可以找到它——尽管文档表明它会使用
shiftfs
orfuse-overlayfs
来实现此目的,而不是本机 Linux idmapping。