用singularity来管理软件
背景
生物信息中的分析流程往往需要消耗很大的内存,读写以TB计算的数据,属于典型的高性能计算(HPC)应用。生信分析流程中要调用大量的分析程序以及内部开发脚本,环境的配置与管理极为复杂,可重复性低,导致流程的升级、管理、迁移成为大难题。
现有的IT技术中其实有解决以上问题的方法,如Docker。然而生信分析集群和普通的IT服务器又有很大区别,如开发人员无root权限,分析任务需要进行资源管理(内存,CPU)。这些问题都让Docker技术在HPC环境的应用受限,Singularity因此应运而生。
容器技术是一种以应用软件为中心的虚拟化技术。以应用软件为单元,将软件及所有的依赖打包成容器镜像,打包后的容器镜像可直接拷贝到不同的Linux主机上运行。通过容器技术,可以很好的解决安装软件时,依赖库的安装问题、软件环境的隔离以及软件环境的移植问题。
singularity的安装和使用
安装
安装依赖
sudo apt-get update && sudo apt-get install -y \
build-essential \
uuid-dev \
libgpgme-dev \
squashfs-tools \
libseccomp-dev \
wget \
pkg-config \
git \
cryptsetup-bin
安装GO语言
wget https://golang.org/dl/go1.14.12.linux-amd64.tar.gz #下载
tar -C /pub/software -xzvf go1.14.12.linux-amd64.tar.gz #解压
rm go1.14.12.linux-amd64.tar.gz #删除安装包
添加到环境变量
echo 'export PATH=/pub/software/go/bin(你的路径):$PATH' >> ~/.bashrc
下载singularity
下载地址:https://github.com/hpcng/singularity/releases
wget https://github.com/hpcng/singularity/releases/download/v3.7.2/singularity-3.7.2.tar.gz
tar -xzf singularity-3.7.2.tar.gz #解压
cd singularity
安装singularity
./mconfig
cd builddir
make
sudo make install
记得添加到环境变量
没有出现报错信息就不用管提示
快速上手
下载镜像
可以从 Container Library(https://cloud.sylabs.io/library)
例如:singularity pull library://cenat/default/blast.sif:latest
or Docker Hub(https://hub.docker.com/)下载images。
例如:singularity pull docker://ncbi/blast
singularity pull --arch amd64 library://library/default/ubuntu:20.04
创建沙箱
刚下载下来的ubuntu_20.04.sif 只是一个纯净的系统,我们需要创建一个沙箱,给里面装软件。
singularity build --sandbox blast ubuntu_20.04.sif
进入容器
默认会自动挂载PWD , /tmp , /proc , /sys , /dev 目录。
singularity shell --writable --fakeroot blast
在容器中安装软件,建议不要使用anaconda 安装,而是手动安装,我们要尽量保持容器轻量。
添加环境变量
退出容器后, 在blast/environment 中添加PATH
vi blast/environment
#!/bin/sh
# Custom environment shell code should follow
export PATH=/opt/ncbi-blast-2.10.1+/bin:$PATH
打包
软件全部安装完成之后将容器打包
singularity build blast.sif blast
运行程序
singularity exec blast.sif blasp XXX 后面接软件的用法
运行容器
交互式运行
singularity shell blast.sif bash
直接运行
singularity exec blast.sif blastp
用户和权限
使用容器不得不考虑安全性,安全性来自两个方面,一个是使用了不被信任的容器,这个就像你在电脑上安装了不被信任的软件一样,Singularity提供了签名机制来验证;另一方面是容器会不会越权对Host 做一些不该做的事情,这个是需要考虑的。
singularity 的解决办法是会在容器内动态创建一个用户,该用户与Host里的用户名、组名、权限等都保持一致。这样你在Host 中做不了的事情,在容器里也干不了。