一、singularity 安装
通过以下命令可以安装singularity
git clone https://github.com/singularityware/singularity.git
cd singularity
./autogen.sh
./configure --prefix=/usr/local
make
sudo make install
在执行 ./autogen.sh 时,可能会出现如下报错
此时需要执行以下命令,安装相应的依赖
sudo apt-get install -y build-essential libtool autotools-dev automake autoconf
安装后,可以运行singularity --help来验证是否安装成功,以及查看相关指令介绍
二、创建singularity镜像
方法一:通过singularity create指令创建一个空镜像(可以通过--size参数指定该镜像的大小或通过singularity expand增大实例化后的容器)。然后通过singularity import指令向该空镜像导入一个镜像。(点击查看更多关于singularity create的内容)
通过singularity create test1.img指令,创建了一个名为test1.img的镜像,并指定该镜像的大小为1000.注意到该操作需要获取root权限。
创建出test1.img镜像后,通过singularity import命令向该镜像中导入一个docker镜像。如下,向创建的test1.img中导入一个ubuntu docker镜像。
方法二:创建一个空镜像后,可以为其创建一个bootstrap定义文件(类似于dokcer 中dockerfile文件的概念),然后通过singularity bootstrap指令来基于该定义文件对空镜像进行修改。
如下,通过vim创建一个定义文件,命名为Singularity(不一定要命名为Singularity,但如果想要将创建好的镜像通过singularity hub分享,则必须命名为Singularity)。
创建Singularity文件后,接下来创建一个空镜像test2.img,然后通过singularity bootstrap test2.img Singularity指令来使用刚刚创建的Singularity文件对test2.img进行修改。之后,运行singularity run test2.img,可以在命令行中看到相应的输出,正是在Singularity文件中的%runscript部分里定义的输出,说明成功地bootstrap了test2.img镜像。
bootstrap定义文件主要包括两部分,Header部分和Sections部分。
在Header部分中,指定了容器的基础操作系统,类似于Dokcerfile中的基础镜像部分。其中的Bootstrap字段指定了以何种方式下载基础镜像,比如在上面的例子中,Bootstrap字段被指定为docker,因此会从docker仓库中下载基础镜像。除此之外,该字段还有yum、debootstrap和arch等值。不同的bootstrap值会跟随不同的其他字段。这里以bootstrap:docker为例,跟随了From、IncludeCmd、Registry和Token等其他字段。其中From字段,用于指定基础镜像的名字,格式为[name]:[version],当不指定[version]时,默认为[name]:[latest]。在上面的例子中,From字段的值为ubuntu:latest,因此会下载一个最新版本的ubuntu镜像。IncludeCmd字段用于指定,当没有显式指定%runscript的内容时,是否将基础镜像的Dokcerfile中定义的CMD指令设置为%runscript中的内容。(点击查看更多关于Header部分的具体介绍)
除了Header部分,在bootstrap定义文件中,还包括多个可选的section,各个section的名字以字符%开头。前面已经介绍了%runscript和%post两个section,前者定义了对镜像执行singularity run时,会被运行的指令;后者定义了对镜像执行bootstrap时,会被运行的指令,只运行一次,被用来下载容器内部的相关软件或依赖;除此之外,还有%setup和%test两个section(点击查看关于这两个section的具体介绍)
方法三:通过singulaity pull指令从 Singularity Hub上下载镜像(singularity pull 指令必须在root权限下执行)。
Singularity Hub类似于Dokcer Hub的概念,是用来上传和下载镜像的在线仓库。如下所示,使用singularity pull ,并指定镜像的路径。当从Singularity Hub上下载时,路径的前缀是shub://。
pull的时候提示访问不了,且在singularity user document中,支持的URIS好像只有http://、https://、docker://(最后一个运行的是非持久化的)(点击查看更多)
三、对singularity镜像的操作
主要有四种操作:run、exec、shell和test(test不常用)。可以在命令行中通过--help参数查看各个指令的文档,比如singularity run --help,可以查看run指令的操作文档。
run指令
格式为singularity (options) run [container image] (options),执行该指令时,会运行镜像的定义文件中%runscript内指定的指令。若没有%runscript,则启动一个默认的shell。(点击查看更多)
关于%runscript,如果在Singularity文件中有指定,则%runscript为该指定内容;如果没有指定,或者创建镜像时采用的是singularity import的方法(此时没有Singularity文件),则默认%runscript是基础镜像中ENTRYPOINT中的指令;如果在Singularity文件中没有指定,IncludeCmd字段的值为yes,则将基础镜像中CMD下的指令设置为%runscript的内容。(点击查看更多)
在前面的介绍中,可以看到,对test2.img运行singularity run时,会执行%runscript中的指令。
exec指令
格式为singularity (options)exec [container image] [command] (options),使用该指令,可以在外部主机上将指定的command运行在指定的容器内。
shell指令
格式为singularity (options)shell [container image] (options),使用该指令时,可以在容器内启动一个shell,因此可以在容器外部与容器内部进行交互操作。运行exit则可以退出该shell;当指定了--writebale参数时,可以对容器进行修改,此时需要有root权限;当container image指定的不是一个本地镜像,而是以docker://为前缀的远程镜像时,该指令会运行一个非持续的容器,当exit该shell时,容器会被自动删除。(点击查看更多)
可以看到,进入container后,运行ls时,列出的是外部主机当前工作目录下的内容,这是因为singulairty容器默认绑定的用户的home目录(以sudo身份和不以sudo身份运行shell,默认的绑定是不同的)(点击查看更多相关内容)
四、其他
1.singularity的一条设计原则,容器内的用户身份与容器外的用户身份是一致的。
2.root权限下shell进去,通过pwd可以看到是位于root目录下;而非root权限下shell进去时,通过pwd可以看到是在当前目录下。也就是说,不同的shell方法,会有不同的系统默认bind。也可以在shell时,通过-B自定义bind的目录。通过-B自定义bind时,要求容器内存在相应目录,但实验时,明明在container里面已经创建了相应目录了,shell -B时还是提示没有在容器内找到相应目录。是不是bind后,两个目录就连通了。
3.关于mount,不理解(点击查看mount相关内容)
4.export部分,也不太理解(点击查看export相关内容)
5.You can even run MPI executables within the container as simply as:
$mpirun -np X singularityexec/path/to/container.img /usr/bin/mpi_program_inside_container(mpi program args)
参考资料
在linux下安装singularity :http://singularity.lbl.gov/install-linux
quick start :http://singularity.lbl.gov/quickstart
介绍几个指令的教程 :http://singularity.lbl.gov/singularity-tutorial
用户指南 :http://singularity.lbl.gov/user-guide