Singularity 容器中的文件所有权和权限

File ownership and permissions in Singularity containers

当我 运行 singularity exec foo.simg whoami 我从主机获得我自己的用户名,不像在 Docker 我会得到 root 或容器指定的用户。

如果我查看此 Singularity 容器内的 /etc/passwd,则会为我的主机用户 ID 添加一个条目到 /etc/passwd

如果我不知道程序将 运行 作为的用户 ID,我该如何制作便携式 Singularity 容器?

我已将 Docker 容器转换为 Singularity 图像,但它希望 运行 作为它定义的特定用户 ID,并且几个目录已 chown那个用户。当我 运行 它在 Singularity 下时,我的主机用户无权访问这些目录。

这将是一个 hack,但我可以将图像修改为 chmod 777 所有这些目录。有没有更好的方法让这个图像像任何用户一样在 Singularity 上工作?

(我是 运行ning Singularity 2.5.2。)

首先,如果可能的话,升级到 Singularity 的 v3(and/or 让您的集群管理员执行此操作)。 v2 不再受支持,多个版本 <2.6.1 存在安全问题。

Singularity 实际上是将主机系统的 /etc/passwd 安装到容器中,以便任何用户都可以 运行。不幸的是,这也有效地破坏了可能由 Dockerfile 创建的任何用户。解决方案如您所想,chmod 任何文件和目录都可以被所有人读取。 chmod -R o+rX /path/to/base/dir%post 步中是最简单的。

由于最终图像是只读的,因此允许写权限不会做任何事情,进入只写入已安装到图像的 files/directories 的心态是很有用的。

实际上有一个比 chmod 777 更好的方法,那就是在图像中用您的应用程序 data/conf 创建一个 "vanilla" 文件夹,然后将其复制到目标容器内的目录,在 运行 时间。

由于复制将由用户实际执行,运行安装容器,您在目标目录中工作时不会有任何权限问题。

你可以看看我在这里做了什么来创建一个便携式远程桌面服务,例如:https://github.com/sarusso/Rosetta/blob/9d33e22/containers/MetaDesktop/files/entrypoint.sh

此方法与 Docker 和 Singularity 兼容,但它是否是可行的解决方案取决于您的用例。最值得注意的是,它要求您使用 --writable-tmpfs.

运行 奇点容器

作为一般性评论,请记住,即使 Singularity 非常强大,它更像是一个环境而不是容器引擎。您可以使用一些特定选项(特别是 --writable-tmpfs --containall --cleanenv --pid)使其更像容器一样工作,但它仍然会有限制(可变用户名和用户 ID 不会消失)。