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

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

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

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