singularity使用
1. singularity简介
singularity与docker功能相似,但是相比与docker需要root权限,或者专门添加用户组,singularity在非root时也可使用,且轻量级,修改方便。singularity镜像有两种格式:sif格式可用于部署;sanbox格式是可写的文件系统,用于开发过程,方便根据需要修改其中的内容。两种格式之间相互转换,即开发完成后转换为sif。具体可参考官网。
2. singularity特性
比如可在本地构建docker镜像,然后上传服务器使用singularity运行,从而避免使用root相关权限;
Singularity镜像 中的文件可以直接在当前系统操作;但是通过shell 启动容器后,容器内是只读的文件系统,如果要在容器内修改,需要root 权限,且指定 -writable;
可直接在sandbox容器内创建环境,安装软件等;
因为 Docker 在安全、权限、高速网络支持、MPI并行支持等各方面天生且无法修补的缺陷,导致 Docker 在超算上不适合使用,为了适应超算特有的平台环境,出现了一些专门为超算环境开发的容器软件,在目前适合于超算的容器软件里,Singularity 的兼容性最好,对超算特性支持最完整,运行性能也是最好的。
现在有很多计算软件已经将容器镜像制作好了,存储在一些云平台上,用户只需要直接下载使用即可。在需要使用容器的时候,用户可以先在云平台上搜索是否已经有制作好的镜像,如果没有,再考虑自行制作容器镜像。
Singularity 支持很多云平台,用户可以在云平台上搜索,并下载所需镜像
singularity pull ubuntu.sif library://library/default/ubuntu:21.04
Docker Hub 是 Docker 的镜像云平台,singularity 程序会将 docker 格式转换为 singularity 使用的 .sif 格式
singularity pull rnaseqv2.0.sif docker://omicsclass/rnaseq:latest
singularity pull singularity-images.sif shub://vsoch/singularity-images
支持 ORAS 的 OCI 镜像云平台
singularity pull image.sif oras://registry/namespace/image:tag
以library:// 开头的URI,表示是从Container Library构建
以docker:// 开头的URI,表示是从Docker Hub构建
以shub:// 开头的URI,表示是从Singularity Hub构建
以docker-archive://开头的 ,表示是从 docker镜像的输出文件构建
singularity 下载docker 上的镜像有时候下载太慢,可以用本地保存的docker镜像文件转换成sif文件:
#下载docker镜像到本地: docker pull omicsclass/pop-evol-gwas:v1.2 #保存镜像文件 docker save omicsclass/pop-evol-gwas:v1.2 > pop-evol-gwas.tar #上传tar文件到服务器,转换成沙箱,可以进一步编辑
singularity build --sandbox pop-evol-gwas docker-archive://pop-evol-gwas.tar #沙箱 #或者 直接转换成sif文件使用
singularity build pop-evol-gwas.sif docker-archive://pop-evol-gwas.tar #sif 文件
当镜像库平台没有找到适用的现成镜像,用户可以在本地将软件打包成镜像 。
首先需要在本地主机上root权限安装singularity,以下为安装步骤。
# 安装依赖 yum install -y gcc libuuid-devel squashfs-tools openssl-devel # 安装go export VERSION=1.13 OS=linux ARCH=amd64 wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz rm -f go$VERSION.$OS-$ARCH.tar.gz echo 'export PATH=/usr/local/go/bin:$PATH' >> /etc/profile source /etc/profile # 安装singularity,这里的安装版本为3.2.0 export VERSION=3.2.0 wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz tar -xzf singularity-${VERSION}.tar.gz cd singularity ./mconfig cd builddir/ make && make install cd ../.. rm -rf singularity*
# 创建sandbox; # 这里将创建的sandbox命名为ubuntu20_lammps,并使用docker hub上现有的容器 ubuntu:20.04 作为基础镜像。 singularity build --sandbox ./ubuntu20_lammps docker://ubuntu:20.04 # 进入创建好的sandbox,并进行修改; # 其中-w表示可写。进入后singularity会自动挂载的HOME目录,如果是用root用户进入,则会挂载/root目录 singularity shell -w ./ubuntu20_lammps # Ubuntu下安装LAMMPS并行版需要安装必要的依赖包 apt update && apt upgrade -y apt install openmpi-bin openmpi-doc libopenmpi-dev -y apt install gcc g++ gfortran make wget vim -y # 安装fftw wget http://www.fftw.org/fftw-3.3.9.tar.gz tar zxvf fftw-3.3.9.tar.gz cd fftw-3.3.9 ./configure --prefix=/opt/software/fftw_3.3.9 --enable-shared --enable-static --enable-fma make -j && make install # 设置临时fftw环境变量 export PATH=/opt/software/fftw_3.3.9/bin:$PATH export LD_LIBRARY_PATH=/opt/software/fftw_3.3.9/lib:$LD_LIBRARY_PATH # 安装lammps wget https://lammps.sandia.gov/tars/lammps-10Feb21.tar.gz tar zxvf lammps-10Feb21.tar.gz cd lammps-10Feb21 cd src vim MAKE/OPTIONS/Makefile.g++_openmpi # 修改如下行 FFT_INC = -DFFT_FFTW -I/opt/software/fftw_3.3.9/include FFT_PATH = -L/opt/software/fftw_3.3.9/lib FFT_LIB = -lfftw3 make yes-std make no-lib make -j g++_openmpi mkdir /opt/software/lammps cp ./lmp_g++_openmpi /opt/software/lammps/ # 设置临时lammps环境变量 export PATH=/opt/software/lammps:$PATH # 验证(容器内) cd /root cp /opt/lammps-10Feb21/bench/in.lj . mpirun --allow-run-as-root -np 2 --mca btl ^openib lmp_g++_openmpi -in in.lj # 退出容器,设置永久环境变量(宿主机) vim ./ubuntu20_lammps/environment # 加入下面两行 export PATH=/opt/software/fftw_3.3.9/bin:/opt/software/lammps:$PATH export LD_LIBRARY_PATH=/opt/software/fftw_3.3.9/lib:$LD_LIBRARY_PATH # 验证(宿主机) singularity exec ./ubuntu20_lammps mpirun --allow-run-as-root -np 2 --mca btl ^openib lmp_g++_openmpi -in in.lj # 把修改好的sandbox打包成sif格式; # 删除不必要的安装包, 如 fftw-3.3.9.tar.gz lammps-10Feb21.tar.gz # 使用前面创建的sandbox目录生成singularity image file格式镜像。 singularity build ubuntu20_lammps.sif ./ubuntu20_lammps
目录映射 [ --bind 或 -B ]
/test 是宿主机目录,/test1 是容器内部目录,容器内部目录不需要提前创建。
singularity shell -B /test:/test1 ./myimage.sif
1.将本地SIF文件,转成sandbox
sudo singularity build --sandbox ./tmp/ your.sif
sudo singularity shell --writable ./tmp/
$ singularity shell ubuntu.sif Singularity: Invoking an interactive shell within container... Singularity ubuntu.sif:~> pwd /home/admin Singularity ubuntu.sif:~> id uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)复制
$ singularity exec ubuntu.sif bash -c "pwd && id" /home/admin uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)复制
$ singularity run ubuntu.sif admin@bdmaster:~$ pwd /home/admin admin@bdmaster:~$ id uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)复制
$ singularity instance.start ubuntu.sif test1 $ singularity instance.start ubuntu.sif test2复制
$ singularity instance.list DAEMON NAME PID CONTAINER IMAGE test1 14172 /home/admin/ubuntu.simg test2 14239 /home/admin/ubuntu.simg复制
可以通过 shell, exec, run 命令来连到容器中运行命令
使用 shell 命令连入容器
$ singularity shell instance://test1 Singularity ubuntu.sif:~> ps -ef UID PID PPID C STIME TTY TIME CMD admin 1 0 0 03:14 ? 00:00:00 singularity-instance: admin [test1] admin 3 0 3 03:14 pts/0 00:00:00 /bin/bash --norc admin 4 3 0 03:14 pts/0 00:00:00 ps -ef复制
使用 exec 执行命令
$ singularity exec instance://test1 ps -ef UID PID PPID C STIME TTY TIME CMD admin 1 0 0 03:14 ? 00:00:00 singularity-instance: admin [test1] admin 6 0 0 03:15 pts/0 00:00:00 ps -ef复制
$ singularity instance.stop test1 $ singularity instance.stop test1复制
在 Singularity 中也可以在 shell, run, instance.start 等命令中通过 "-B" 选项来实现 Docker 中 “-v” 选项提供挂载卷的功能,比如:
$ singularity shell -B /apps:/apps ubuntu.sif
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!