为什么 `singularity run/exec` 会自动绑定特定的某些目录?用例是什么?
Why does `singularity run/exec` automatically bind specific some directories? What is the use case?
我熟悉容器,但对 Singularity 不熟悉,今晚我发现自己在 Singularity 容器中遇到一个损坏的 Python 安装。原来这是因为 $HOME
在我不知情的情况下被挂载到我的容器中。
我想我已经喜欢上了 Python 中的成语“显式优于隐式”。对我来说,自动挂载特定目录是意外行为。
三个问题:
- 为什么 Singularity 默认挂载 $HOME、/tmp、/proc 等?
- 为了让我更熟悉 Singularity,这种行为有哪些用例?
- 我看到了
--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
和显式挂载可能是更好的解决方案,但我很懒,这确保了以下几点:
当前目录挂载到容器中。如果映像中不存在基目录,则工作的隐式安装允许失败,并且会安静地进行。例如,如果您从 /cluster/my-lab/some-project
运行ning 并且您的图像中没有 /cluster
,则不会安装它。如果直接使用显式绑定,这不是问题(-B /cluster/my-lab/some-project
) 或者如果显式绑定具有与当前目录的共享路径 (-B /cluster/data/experiment-123
)。
命令从当前目录的上下文中执行。如果 $PWD
无法按上述方式挂载,singularity 将使用 $HOME
作为工作目录。如果 $PWD
和 $HOME
都挂载失败,则使用 /
。如果您使用相对路径并且您不在预期的位置,这可能会导致问题。由于它特定于主机上的路径,因此在尝试在本地复制问题时,它可能 真的 很烦人。
无论主机 OS 文件结构如何,容器内的基本路径始终相同。一致性好。
剩下的只是正在执行的命令 运行,在本例中,它总结了来自其他处理遗传数据的程序的日志。
我熟悉容器,但对 Singularity 不熟悉,今晚我发现自己在 Singularity 容器中遇到一个损坏的 Python 安装。原来这是因为 $HOME
在我不知情的情况下被挂载到我的容器中。
我想我已经喜欢上了 Python 中的成语“显式优于隐式”。对我来说,自动挂载特定目录是意外行为。
三个问题:
- 为什么 Singularity 默认挂载 $HOME、/tmp、/proc 等?
- 为了让我更熟悉 Singularity,这种行为有哪些用例?
- 我看到了
--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
和显式挂载可能是更好的解决方案,但我很懒,这确保了以下几点:
当前目录挂载到容器中。如果映像中不存在基目录,则工作的隐式安装允许失败,并且会安静地进行。例如,如果您从
/cluster/my-lab/some-project
运行ning 并且您的图像中没有/cluster
,则不会安装它。如果直接使用显式绑定,这不是问题(-B /cluster/my-lab/some-project
) 或者如果显式绑定具有与当前目录的共享路径 (-B /cluster/data/experiment-123
)。命令从当前目录的上下文中执行。如果
$PWD
无法按上述方式挂载,singularity 将使用$HOME
作为工作目录。如果$PWD
和$HOME
都挂载失败,则使用/
。如果您使用相对路径并且您不在预期的位置,这可能会导致问题。由于它特定于主机上的路径,因此在尝试在本地复制问题时,它可能 真的 很烦人。无论主机 OS 文件结构如何,容器内的基本路径始终相同。一致性好。
剩下的只是正在执行的命令 运行,在本例中,它总结了来自其他处理遗传数据的程序的日志。