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

2024-03-12 23:28

本文主要是介绍Singularity(五)| 容器挂载和环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 多平台发布

这篇关于Singularity(五)| 容器挂载和环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802930

相关文章

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

linux lvm快照的正确mount挂载实现方式

《linuxlvm快照的正确mount挂载实现方式》:本文主要介绍linuxlvm快照的正确mount挂载实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux lvm快照的正确mount挂载1. 检查快照是否正确创建www.chinasem.cn2.