镜像-docker转Singularity
前言
docker镜像极大方便了软件的使用,但docker对于集群用户却不友好,所有命令都需要root权限。近期在集群使用singularity,终于把长期以来的痛点解决了。我们实验室内有一个普通计算机搭建的微型服务器,仅仅用来跑blast比对啥的,无法运行多核大内存任务,在这台服务器上我是有root权限的。集群的服务器可以运行大任务,但管理是不可能给你root权限的。singularity的优点是:在集群上安装之后,root用户帮忙给你配置一下,使你获得fake root权限,以后就可以永久无root使用了。它的缺点就是支持的软件较少,不如docker那么广泛,但是可以通过将docker镜像转成singularity镜像。
那么我们可以先在有root权限的微型服务器上下载docker镜像,然后将其转成singularity镜像,之后再把构建好的镜像拷贝到集群服务器上就可以了。
1,集群安装Singularity
conda create -n singularity
conda activate singularity
conda install singularity==3.8.6
2,找集群管理员(root)配置Singularity
如果节点很多的话,可以跟管理员只在某几个节点进行配置,以后提交Singularity任务的话,提交到配置过的节点就可以了。
2.1,namespace配置
运行以下命令即可:
#sysctl 是一个用于在运行时动态修改内核参数的工具。 -p 参数后面跟的是配置文件路径,用来加载指定的sysctl配置文件并应用其中的内核参数设置。
sudo sh -c 'echo user.max_user_namespaces=15000 >/etc/sysctl.d/90-max_net_namespaces.conf'
sudo sysctl -p /etc/sysctl.d /etc/sysctl.d/90-max_net_namespaces.conf
这样修改实测是可以的,但是或许服务器断开重启的话就失效了。服务器运维给了另外一个命令,需要重启服务器生效,这个应该是永久性的。
echo "user.max_user_namespaces=15076" >> /etc/sysctl.conf
grubby --args="namespace.unpriv_enable=1 user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
2.2,配置fake root
把singularity的绝对路径和用户名提供给root,然后让他运行:
sudo /absolute path/singularity config fakeroot --add userid
这样就算配置好了,对于支持singularity的软件可以直接使用了。
下面是docker镜像转singularity
1,安装软件
首先微型服务器上有docker,之后按照上面的方法安装singularity,因为有root权限,就不需要配置fake root了。
2,准备本地镜像
我想配置的是popgenmethods/smcpp: SMC++ ,这个软件很难安装,之前运行是在实验室的微型服务器上,但集群不行。
#查看docker已有的镜像
sudo docker images
运行命令发现镜像已经存在
3,利用docker官方提供的registry镜像,搭建本地docker仓库镜像服务
sudo docker pull registry
#查看本地ip
ip addr
#ip为127:0:0:1
4,在docker内配置适用的ip
sudo vim /etc/docker/daemon.json
#补充以下信息/ 修改成个人的ip/
{
"insecure-registries": ["127.0.0.1:5000"]
}
#重新启动docker
sudo service docker stop
sudo service docker start
sudo docker info #查看下图
图
5,将本地的 docker 镜像上传到 本地的 docker 镜像仓库
sudo docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
#查看是否建好仓库
sudo docker ps
#设置上传镜像的tag
sudo docker tag terhorst/smcpp:latest 127.0.0.1:5000/terhorst/smcpp:latest
#上传到本地仓库
sudo docker push 127.0.0.1:5000/terhorst/smcpp:latest
6,镜像转换
#从本地仓库转化成sif镜像
singularity build --nohttps my_smcpp.sif docker://127.0.0.1:5000/terhorst/smcpp:latest
最后生成的my_smcpp.sif
文件即可转移到集群上运行
7,测试
jsub -m cu01 -I bash
ssh cu01
singularity exec my_smcpp.sif smc++ -h
运行成功!输出为:
INFO: Converting SIF file to temporary sandbox...
usage: smc++ [-h] {chunk,cite,cv,estimate,plot,posterior,simulate,split,vcf2smc,version} ...
positional arguments:
{chunk,cite,cv,estimate,plot,posterior,simulate,split,vcf2smc,version}
chunk Sample randomly with replacement chunks from data file(s)
cite Print citation information for SMC++
cv Perform cross-validated estimation procedure.
estimate Estimate size history for one population
plot Plot size history from fitted model
posterior Store/visualize posterior decoding of TMRCA
simulate Simulate from a fitted model
split Estimate split time in two population model
vcf2smc Convert VCF to SMC++ format
version Print version string
optional arguments:
-h, --help show this help message and exit
INFO: Cleaning up image...
yeah~
本文参考:进阶 | 本地「Docker」镜像转换为「Singularity」镜像,直接运行于任何服务器~ - 简书 (jianshu.com)