为什么 `singularity run/exec` 会自动绑定特定的某些目录?用例是什么?

Why does `singularity run/exec` automatically bind specific some directories? What is the use case?

我熟悉容器,但对 Singularity 不熟悉,今晚我发现自己在 Singularity 容器中遇到一个损坏的 Python 安装。原来这是因为 $HOME 在我不知情的情况下被挂载到我的容器中。

我想我已经喜欢上了 Python 中的成语“显式优于隐式”。对我来说,自动挂载特定目录是意外行为。

三个问题:

  1. 为什么 Singularity 默认挂载 $HOME、/tmp、/proc 等?
  2. 为了让我更熟悉 Singularity,这种行为有哪些用例?
  3. 我看到了 --no-home 标志,但是是否有一个标志可以在不需要更改默认 Singularity 配置的情况下禁用所有默认安装?

它是设计、便利性和技术必要性的结合。

最大的原因是,除非您使用某些另有说明的参数,否则 Singularity 图像是只读文件系统。您需要在某个地方写入输出和在此过程中创建的任何临时文件。也许你知道在你的输出目录中挂载,但是有各种各样的文件在我们从未想过的后台创建/修改/删除。隐式自动挂载提供适用于大多数情况的合理默认值。

简单的示例:您正在对某些数据执行大型 sort 和过滤操作,但您将结果打印到控制台,因此除了原始数据外,您不必费心加载任何内容。但即使经过一些操作和过滤,数据的大小仍会超过可用内存,因此排序会回退到使用 /tmp 中的小文件,然后在进程完成时被删除。然后它崩溃了,因为你不能写入 /tmp.

您可以要求用户在 运行 上手动指定要挂载到 /tmp 的内容,或者您​​可以使用像 /tmp 这样合理的默认值,并允许覆盖它由用户 (SINGULARITY_TMPDIR-B $PWD/fake_tmp:/tmp--contain/--containall)。这些都是可配置的,因此管理员可以针对 运行ning 环境设置合理的默认值。

一些坐骑也有技术原因。 例如, /etc/passwd/etc/group 需要匹配主机 OS 上的权限。 bind paths and mounts are actually pretty good and have more specifics on the whats and whys, and even the answer to your third question: --no-mount. The --contain/--containall flags will probably also be of interest. If you really want to deep dive, there are also the admin docs and the source code on github.

上的文档

一个简单但真实的奇点用例,并附有解释:

singularity exec \
    --cleanenv \
    -H $PWD:/home \
    -B /some/local/data:/data \
    multiqc.sif \
    multiqc -i $SAMPLE_ID /data

--cleanenv / -e: 意想不到的挂载乐趣你已经体验过了,还有意想不到的环境变量! --cleanenv/-e 告诉 Singularity 不要将主机执行环境持久化在容器中。你仍然可以使用,例如,SINGULARITYENV_SOMEVAR=23 在容器内有 SOMEVAR=23,因为它是明确设置的。

-H $PWD:/home:这会将当前目录挂载到容器中到/home并设置HOME=/home。虽然使用 --contain/--containall 和显式挂载可能是更好的解决方案,但我很懒,这确保了以下几点:

  1. 当前目录挂载到容器中。如果映像中不存在基目录,则工作的隐式安装允许失败,并且会安静地进行。例如,如果您从 /cluster/my-lab/some-project 运行ning 并且您的图像中没有 /cluster,则不会安装它。如果直接使用显式绑定,这不是问题(-B /cluster/my-lab/some-project) 或者如果显式绑定具有与当前目录的共享路径 (-B /cluster/data/experiment-123)。

  2. 命令从当前目录的上下文中执行。如果 $PWD 无法按上述方式挂载,singularity 将使用 $HOME 作为工作目录。如果 $PWD$HOME 都挂载失败,则使用 /。如果您使用相对路径并且您不在预期的位置,这可能会导致问题。由于它特定于主机上的路径,因此在尝试在本地复制问题时,它可能 真的 很烦人。

  3. 无论主机 OS 文件结构如何,容器内的基本路径始终相同。一致性好。

剩下的只是正在执行的命令 运行,在本例中,它总结了来自其他处理遗传数据的程序的日志。