1
Singularity
Singularity 是一个容器平台,专为科学计算和数据密集型应用设计。最初是由 Gregory Kurtzer 在 2015 年创立的。Gregory Kurtzer 有着深厚的高性能计算背景,并且在开源社区中有着广泛的贡献。他意识到现有的容器解决方案不能很好地满足科学计算社区的需求,特别是在安全和易用性方面。因此,他创建了 Singularity,目标是提供一个既安全又高效的容器解决方案,特别是为了满足科研和企业中对高性能计算需求。其优势如下:
安全性:Singularity 的设计允许用户以非特权用户的身份运行容器,减少了系统受到恶意软件攻击的风险。
复制性:Singularity 通过容器来封装整个应用及其依赖,确保了在不同环境之间的一致性和复制性,对于科研工作尤其重要,因为这有助于确保实验结果的可重复性。
移植性:Singularity 容器可以轻松地在不同的操作系统和平台上运行,包括在大多数高性能计算集群上。这使得研究人员可以在个人电脑上开发和测试应用,然后无缝地迁移到大型计算集群上执行大规模计算任务。
易用性:Singularity 允许用户直接访问宿主机的文件系统和网络,这简化了数据和资源的管理,使得用户能够更容易地使用和部署容器。
与现有工具的兼容性:Singularity 支持与 Docker 容器格式的兼容,意味着用户可以轻松地将 Docker 容器转换为 Singularity 容器,利用 Singularity 在安全性和性能上的优势,同时保持对已有容器生态系统的兼容。
官网:https://sylabs.io/
文档:https://sylabs.io/docs/
github:https://github.com/sylabs/singularity
2
发表文章
题目
:Singularity: Scientific containers for mobility of compute
日期
:2017年5月11日
期刊
:PLOS ONE
作者&单位
:Gregory M. Kurtzer && Lawrence Berkeley National Lab
DOI
:10.1371/journal.pone.0177459
3
如何安装
非root用户推荐使用conda 安装。(唯一不足是Conda安装的singularity不是最新版本)
conda create -n singularity singularity=3.8.6 -y
4
生信分析中为什么使用Singularity
容器是一种在隔离环境中运行应用程序的技术。与传统虚拟机 (VM) 相比,它们具有多项优势,例如 更快的部署时间和可重复性。容器还允许开发人员构建和部署软件,无需担心底层基础设施或操作系统详细信息。在生物信息学分析中,使用Singularity 容器技术具有以下优势:
环境一致性和可重复性
:生物信息学项目常常依赖于特定版本的软件和库。Singularity 容器可以将软件及其依赖项打包在一起,确保分析环境的一致性,无论是在本地机器、服务器还是云平台上。这对于实验的可重复性至关重要,因为它保证了其他研究者可以准确复制实验条件,验证和复现研究结果。
高性能计算(HPC)友好
:Singularity 特别设计来支持高性能计算环境。它允许用户以非特权方式运行容器,与 HPC 系统的安全模型兼容。这意味着用户可以在不需要管理员权限的情况下部署和运行容器,这对于多用户的HPC环境是非常重要的。
移植性
:Singularity 容器可以在任何支持 Singularity 的系统上运行,不受操作系统版本限制。这种高度的移植性确保了生物信息学分析可以轻松地从一个计算环境迁移到另一个,无论是从个人电脑到云平台,还是在不同的研究机构之间共享。
数据和资源访问
:Singularity 容器可以直接访问宿主机上的文件系统和网络,这简化了数据的管理和传输过程。对于需要处理大量数据的生物信息学分析来说,能够无缝访问外部数据存储非常重要。
安全性
:与其他容器技术相比,Singularity 提供了更强的安全保障。它防止了容器内的用户获取宿主机的 root 权限,减少了安全风险。这一点对于确保生物信息学数据的安全尤为重要,特别是在处理敏感或受保护的数据时。
5
基本使用
运行测试
singularity run library://library/tutorial101/wttr:latest
与Singularity容器进行交互
shell
允许用户以交互的方式进入到一个特定的容器环境中
# # 进入特定的容器环境 singularity shell library://josue-sylabs/demo/wttr:latest INFO: Using cached imageSingularity> _ ## 查看容器信息 Singularity> cat /etc/os-release ##退出交互 Singularity> exit
从容器库下载容器映像文件并查看容器信息
--runscript
显示容器的runscript(查看特定元数据类型)。Runscript 是容器的默认执行脚本,当使用
singularity run
命令或直接运行容器文件时会执行
.sif
是 Singularity Image Format 的缩写,这是 Singularity 的默认容器映像格式,它是一个单一的、不可变的、和可移植的文件格式
# #下载容器映像文件 singularity pull wttr.sif library://josue-sylabs/demo/wttr:latest ## `wttr.sif`:指定下载后的容器映像文件的本地文件名。 ##查看容器的默认执行脚本 singularity inspect --runscript wttr.sif
从Docker Hub下载并保存为 Singularity 映像文件
# #从Docker Hub下载 singularity pull ubuntu.sif docker://ubuntu ##进入交互——显示调用 singularity shell ubuntu.sif # #非显示调用 ./ubuntu.sif
创建容器
主要分为4步
创建容器沙盒
:沙盒是一个可写的容器目录。通过创建沙盒,可以轻松地更改容器内部的文件系统,就像在一个常规的目录中一样。
以可写模式进入容器
:使用
--writable
选项运行
singularity shell
命令来修改沙盒容器。
执行配置软件所需的操作
:在沙盒容器内部,执行必要的命令来配置软件,设置环境变量,并记录这些操作步骤,以便将它们包含在定义文件中。
根据定义文件构建容器并进行测试运行
:一旦定义文件编写完成,就可以用它来构建一个不可变的容器映像文件。测试运行构建的容器映像,如果遇到问题,返回到步骤 1 重新开始。
定义文件分为两部分
:
Header
:描述了要在容器内构建的核心操作系统。例如,它可以指定要从哪个基础映像开始构建。
Bootstrap:这个关键字定义了基础镜像的来源、协议或格式。你可以选择多个来源,包括 Singularity 容器库(library)、Docker Hub、OCI Registry as Storage(ORAS)、yum、本地镜像(localimage)、debootstrap、开放容器倡议(OCI)、BusyBox 等等。
From:这个关键字依赖于 Bootstrap 的值。
Sections
:这些是一组命令,用于描述在最终映像中的特定动作。包括设置环境、复制文件、设置环境变量、下载文件、进行测试等等。
%files:这个部分允许你复制文件进入容器。这在程序编译完成后,你想将其移动到第二阶段容器中时非常有用。
%environment:这个部分允许你定义运行时会设置的环境变量。这些变量在构建时不可用。
%post:这里可以使用像 git 和 wget 这样的工具从互联网下载文件,安装新软件,编写配置文件,在容器内创建目录。
%runscript:这个部分包含了写入到容器内部文件的命令,这些命令会在使用
singularity run
命令运行容器映像时执行。
%startscript:这个部分类似于
%runscript
,不同之处在于,
%startscript
中的命令会在执行
singularity instance start
命令时运行。
%test:这个部分包含了在构建过程结束时执行的命令。它通常包含你选择的验证命令,也会在使用
singularity test
命令时执行。
%labels:这个部分用于向文件
/.singularity.d/labels.json
添加元数据,标签通过键值对定义,并可以在执行
singularity inspect
命令时显示。
%help:这部分的文本会被转移到容器内的一个元数据文件中。可以使用
singularity run-help
命令显示这些帮助信息。
# # 需管理员权限 sudo singularity build --sandbox sandbox/ docker://ubuntu:22.04 sudo singularity shell --writable sandbox/
大部分情况下我们是没有管理员权限,那么我们可以使用以下命令
fakeroot
允许用户在容器及其请求的命名空间内拥有与 root 用户几乎相同的管理权限。这意味着用户可以执行通常需要 root 权限的操作,而不需要实际的 root 权限。通过
fakeroot
用户创建的所有文件或目录,在容器内部归 root 所有,在容器外部则归创建它们的用户和组所有。
--fakeroot
选项只能与以下几个命令一起使用:
instance start
:启动一个容器实例。
非root用户创建一个容器映像
# # 新建一个testfiel echo "This is a test file." > testfile ##创建定义文件 vim test.def ##定义文件写入以下内容