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

相关文章

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D