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

Vor*_*ity 6 singularity-container

我熟悉容器,但对 Singularity 很陌生,今晚我发现自己在 Singularity 容器中与损坏的 Python 安装作斗争。事实证明,这是因为在$HOME我不知情的情况下被安装到我的容器中。

我想我已经喜欢上了 Python 中的“显式优于隐式”这句话。对我来说,自动安装特定目录是意想不到的行为。

三个问题:

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

tsn*_*lan 9

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

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

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

/tmp您可以要求用户手动指定运行时要安装的内容,或者您​​可以使用健全的默认值,例如/tmp并允许用户覆盖它(SINGULARITY_TMPDIR, -B $PWD/fake_tmp:/tmp, --contain/--containall)。这些都是可配置的,因此管理员可以根据运行环境设置合理的默认值。

某些安装座也存在技术原因。例如, /etc/passwd/etc/group需要匹配主机操作系统上的权限。关于绑定路径和安装的文档实际上非常好,并且对内容和原因有更多细节,甚至还回答了您的第三个问题:--no-mount。旗帜--contain/--containall可能也会引起人们的兴趣。如果您确实想深入了解, GitHub 上还有管理文档和源代码。


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

singularity exec \
    --cleanenv \
    -H $PWD:/home \
    -B /some/local/data:/data \
    multiqc.sif \
    multiqc -i $SAMPLE_ID /data
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

  • 谢谢你的回答。这正是我一直在寻找的东西,并且满足了我需要理解的所有要点。我真的很感谢你花时间写这篇文章!唯一对我来说还没有意义的部分是“--contain/--containall”标志,但我希望随着更多的使用它会更有意义。 (2认同)