singularity

一、singularity 安装

通过以下命令可以安装singularity

git clone https://github.com/singularityware/singularity.git

cd singularity

./autogen.sh

./configure --prefix=/usr/local

make

sudo make install

在执行 ./autogen.sh 时,可能会出现如下报错

singularity_第1张图片

此时需要执行以下命令,安装相应的依赖

sudo apt-get install -y build-essential libtool autotools-dev automake autoconf

安装后,可以运行singularity --help来验证是否安装成功,以及查看相关指令介绍

singularity_第2张图片


二、创建singularity镜像

方法一:通过singularity create指令创建一个空镜像(可以通过--size参数指定该镜像的大小或通过singularity expand增大实例化后的容器)。然后通过singularity import指令向该空镜像导入一个镜像。(点击查看更多关于singularity create的内容)

通过singularity create test1.img指令,创建了一个名为test1.img的镜像,并指定该镜像的大小为1000.注意到该操作需要获取root权限。

singularity_第3张图片

创建出test1.img镜像后,通过singularity import命令向该镜像中导入一个docker镜像。如下,向创建的test1.img中导入一个ubuntu docker镜像。

singularity_第4张图片

方法二:创建一个空镜像后,可以为其创建一个bootstrap定义文件(类似于dokcer 中dockerfile文件的概念),然后通过singularity bootstrap指令来基于该定义文件对空镜像进行修改。

如下,通过vim创建一个定义文件,命名为Singularity(不一定要命名为Singularity,但如果想要将创建好的镜像通过singularity hub分享,则必须命名为Singularity)。

singularity_第5张图片
该文件中的前两句指定了要从Docker 仓库中pull 一个ubuntu镜像;%runscript中的指令,会在运行singularity run指令时被执行(singularity run指令会在后面介绍,类似于docker run指令);%post中的指令,会在运行singularity bootstrap时被执行,只执行一次,这里通常放置一些安装软件或依赖等的指令。

创建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指令的操作文档。

singularity_第6张图片
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时,容器会被自动删除。(点击查看更多)

singularity_第7张图片

可以看到,进入container后,运行ls时,列出的是外部主机当前工作目录下的内容,这是因为singulairty容器默认绑定的用户的home目录(以sudo身份和不以sudo身份运行shell,默认的绑定是不同的)(点击查看更多相关内容)

四、其他

1.singularity的一条设计原则,容器内的用户身份与容器外的用户身份是一致的。

singularity_第8张图片

2.root权限下shell进去,通过pwd可以看到是位于root目录下;而非root权限下shell进去时,通过pwd可以看到是在当前目录下。也就是说,不同的shell方法,会有不同的系统默认bind。也可以在shell时,通过-B自定义bind的目录。通过-B自定义bind时,要求容器内存在相应目录,但实验时,明明在container里面已经创建了相应目录了,shell -B时还是提示没有在容器内找到相应目录。是不是bind后,两个目录就连通了。

3.关于mount,不理解(点击查看mount相关内容)

singularity_第9张图片

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

你可能感兴趣的:(singularity)