Singularity(五)| 容器挂载和环境

我们可以按照如下方式运行 Singularity 容器:

singularity shell samtools
singularity exec samtools samtools help
singularity run samtools
singularity exec instance://samtools

在我们逐个详解容器运行规则之前,我们需要首先为大家介绍一下容器的挂载

前面我们在容器简介中提到,开发容器的目的之一主要是为了解决依赖库的安装、软件环境的隔离以及软件环境的移植问题。因此,容器的核心特性之一就是它们的文件系统与宿主机相隔离。如果我们查看一个 singularity 容器的根目录,也会看到与 Linux 主机根目录相似的结构。这意味着容器内的应用程序只能看到(并与之交互)这个封闭环境中的文件和目录。

与 Linux 下挂载(mount)外置硬盘设备类似,容器同样需要通过挂载 (bind) 的操作与我们宿主机上的文件系统交互。

绑定路径和挂载

当调用容器时,Singularity 会将主机操作系统 “swap” 为容器中的操作系统,从而导致我们无法访问主机文件系统。然而,在日常使用场景中,已安装至容器中的应用程序的输入和输出文件往往存储在主机文件系统中,因此,我们需要从容器内读取和写入主机系统上的文件。

singularity 使用 --bind/-B 宿主机目录:容器内目录 选项将主机系统上的目录映射到容器内的目录。这允许我们从容器内部访问主机上的文件,从而在主机系统上读写数据。

系统默认的绑定路径

系统管理员可以定义在每个容器中自动包含哪些绑定路径。有些绑定路径是自动生成的(例如用户的家目录),有些是静态定义的(例如 Singularity 配置文件中的绑定路径)。默认配置下,系统默认绑定路径为:$HOME/sys:/sys/proc:/proc/tmp:/tmp/var/tmp:/var/tmp/etc/resolv.conf:/etc/resolv.conf/etc/passwd:/etc/passwd$PWD: 前面的第一个路径为来自主机的路径,第二个路径为容器内的路径,例如:

$ echo "Hello from inside the container" > $HOME/hostfile.txt
$ singularity exec lolcow_latest.sif cat $HOME/hostfile.txt
Hello from inside the container

这个示例之所以有效,是因为 hostfile.txt 存在于当前用户的主目录中。默认情况下,Singularity --bind 在运行时会将 /home/$USER/tmp$PWD 挂载到容器中。

用户自定义的绑定路径

singularity 操作指令(runexecshellinstance start)通过 --bind/-B 命令行选项来指定绑定路径,并且还支持 $SINGULARITY_BIND (或 $SINGULARITY_BINDPATH)环境变量。该选项的参数是一个逗号分隔的绑定路径规范字符串,格式为:out1:in1,out2:in2,out3outin 分别为容器外部和内部路径,如果未给出内部路径,则将内部路径设置为完全相同的外部路径。外部路径必须是已创建的,而容器中的内部路径可以是虚假的注:当与 --writable 选项连用时,被绑定的容器内部路径最好是已经存在的。我们可以多次指定 --bind/-B 选项,也可以使用逗号分隔多个绑定路径。

$ ls /data
bar  foo
$ singularity exec --bind /data:/mnt,/test:/test,/app my_container.sif ls /mnt
bar  foo

我们也可以使用环境变量而非命令行参数指定绑定路径:

$ export SINGULARITY_BIND="/opt,/data:/mnt"
$ singularity shell my_container.sif

如需要将多个目录绑定到 Singularity 容器中,并且长期保持不变,我们可以进一步将这个变量写入 .bashrc 文件中。

singularity环境变量

-C, --containall

使用容器技术时,--containall 参数可用于隔离进程ID(PID)、进程间通信(IPC)和环境变量。这提供了一个更加全面的隔离级别,确保容器内的应用与宿主系统之间的隔离,从而增强了安全性和一致性。具体来说:

  1. PID(进程ID)隔离:确保容器内的进程只能看到容器内部的其他进程。这意味着容器内的进程和宿主机系统的进程是完全隔离的,容器内的PID命名空间与宿主机的PID命名空间分离。

  2. IPC(进程间通信)隔离:防止容器内的进程与宿主机或其他容器的进程之间的未授权IPC通信。IPC隔离确保了消息队列、信号量和共享内存等IPC资源在容器内部是封闭的,不会与宿主机或其他容器共享。

  3. 环境变量隔离:通过隔离环境变量,可以防止容器内的应用程序访问或修改宿主机上的环境变量,这有助于保护敏感信息并确保容器内应用的运行环境独立于宿主机环境。

我们可以搭配 slurm HPC 管理系统调用容器:

srun -p P1 -c 1 singularity exec /prog1/Container/ACGT101_5R/qiime-1.8.0.sif 、
 /usr/local/bin/alpha_diversity.py \
 -i Species_table_even14870.biom \
 -m observed_species,shannon,simpson,chao1,goods_coverage \
 -o alpha_diversity.txt

此时我们可能会遇到以下错误信息:

[node03:35656] OPAL ERROR: Not initialized in file pmix2x_client.c at line 109
--------------------------------------------------------------------------
The application appears to have been direct launched using "srun",
but OMPI was not built with SLURM's PMI support and therefore cannot
execute. There are several options for building PMI support under
SLURM, depending upon the SLURM version you are using:

  version 16.05 or later: you can use SLURM'
s PMIx support. This
  requires that you configure and build SLURM --with-pmix.

  Versions earlier than 16.05: you must use either SLURM's PMI-1 or
  PMI-2 support. SLURM builds PMI-1 by default, or you can manually
  install PMI-2. You must then build Open MPI using --with-pmi pointing
  to the SLURM PMI library location.

Please configure as appropriate and try again.
--------------------------------------------------------------------------
*** An error occurred in MPI_Init_thread
*** on a NULL communicator
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
***    and potentially your MPI job)
[node03:35656] Local abort before MPI_INIT completed completed successfully, but am not able to aggregate error messages, and not able to guarantee that all other processes were killed!

错误原因:在 singularity 搭配集群 SLURM 使用时出现。

解决方法:在调用 singularity 时加上 -C 参数隔离环境变量。

清理singularity

前面我们提到,singularity 使用标准的 Linux 文件系统来存储容器,因此,对于 sandbox 和 sif 格式的容器,我们直接使用 rm 指令删除即可。

此外,我们可以通过 cache 管理本地 singularity 缓存

$ singularity cache list [list options...]
There are 2 container file(s) using 51.16 MiB and 20 oci blob file(s) using 3.14 GiB of space
Total space used: 3.19 GiB
  • -T, --type strings

    要显示的缓存类型列表:library, oci, shub, blob(s), all (default [all])

$ singularity cache clean [clean options...]
  • -T, --type strings

    要清理的缓存类型列表 (ibrary, oci, shub, blob, net, oras, all) (default [all])

  • -D, --days int

    删除所有超过指定天数的缓存项

扫码关注微信公众号【生信F3】获取文章完整内容,分享生物信息学最新知识。 ShengXinF3_QRcode

本文由 mdnice 多平台发布

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐