Vor*_*ity 6 singularity-container
我熟悉容器,但对 Singularity 很陌生,今晚我发现自己在 Singularity 容器中与损坏的 Python 安装作斗争。事实证明,这是因为在$HOME我不知情的情况下被安装到我的容器中。
我想我已经喜欢上了 Python 中的“显式优于隐式”这句话。对我来说,自动安装特定目录是意想不到的行为。
三个问题:
--no-home标志,但是是否有一个标志可以禁用所有默认安装而不需要更改默认的 Singularity 配置?它是设计、便利性和技术必要性的结合。
最大的原因是,除非您使用某些另有说明的参数,否则奇点图像是只读文件系统。您需要某个地方来写入输出以及在此过程中创建的任何临时文件。也许您知道要在输出目录中挂载,但是在后台创建/修改/删除的各种文件是我们从未考虑过的。隐式自动挂载提供了在大多数情况下都有效的合理默认值。
简单的示例:您正在对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=23在SOMEVAR=23容器内部,因为这是明确设置的。
-H $PWD:/home:这会将当前目录安装到容器中/home并设置HOME=/home。虽然使用--contain/--containall显式挂载可能是更好的解决方案,但我很懒,这可以确保以下几点:
当前目录已安装到容器中。如果映像中不存在基本目录,则允许工作的隐式安装失败,并且会悄悄地失败。例如,如果您正在运行/cluster/my-lab/some-project并且映像内部没有该/cluster映像,则不会安装该映像。如果直接使用显式绑定 ( ) 或者显式绑定与当前目录-B /cluster/my-lab/some-project具有共享路径 ( ),则这不是问题。-B /cluster/data/experiment-123
该命令是从当前目录的上下文中执行的。如果$PWD按照上述方式挂载失败,则使用奇异性$HOME作为工作目录。如果 和 都$PWD无法$HOME安装,/则使用。如果您使用相对路径并且未到达预期位置,这可能会导致问题。由于它特定于主机上的路径,因此在尝试在本地复制问题时可能会非常烦人。
无论主机操作系统文件结构如何,容器内部的基本路径始终相同。一致性很好。
其余的只是正在运行的命令,在本例中它总结了其他处理遗传数据的程序的日志。
| 归档时间: |
|
| 查看次数: |
3529 次 |
| 最近记录: |