美文网首页
镜像-docker转Singularity

镜像-docker转Singularity

作者: 郝永超M1racle | 来源:发表于2024-04-10 13:06 被阅读0次

前言

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)

相关文章

网友评论

      本文标题:镜像-docker转Singularity

      本文链接:https://www.haomeiwen.com/subject/ytmqxjtx.html