前述,我用 docker 制备了一个汇集多个生信软件的容器,其中一部分软件直接用apt-get install XXXX
完成。这部分软件,理所当然会自动映射绕容器的/usr/bin
目录。对应的,当docker镜像转换为 singularity 容器后,我们可以直接在singularity shell YYYY.sif
后直接访问对应程序。
但是,我还有一份部分软件,为了方便,全部放在docker镜像中的/home/softwares
目录下。这个目录对于docker容器没啥问题,因为路径上下文是固定的,无论到哪个服务器上。但对于singularity来说,shell
进去后,路径还是原来的路径,同时也并不会映射/home/softwares
。 简单来说,就是这部分软件不容易访问,同时在.bashrc
中export PATH
也会失效,类似的逻辑上/usr/bin
下的软连接同样会失效。
对于此,我开始思考,那么conda
的就不会失效?因为home
目录是不对的。逻辑上,singularity
的home
默认为宿主机
的home
。
简单检索一下,大体如下,
1. 相关注意事项
![](https://img.haomeiwen.com/i10518391/2b57dd09c6ed4fc7.png)
2. 另一个相关注意事项
![](https://img.haomeiwen.com/i10518391/de2cf1b675179661.png)
3. 有一个快捷转换教程
https://www.nas.nasa.gov/hecc/support/kb/converting-docker-images-to-singularity-for-use-on-pleiades_643.html
4. 可行解决方案之一
折腾了一整个下午,估计有 6 个多小时。放弃后吃晚饭,期间想了下,既然不支持路径上下文自动转换,那我就自己映射不就完了?于是测试了下,似乎完全没问题.....
当然,这个主要应用在环境部署过程中使用了较多无关路径,比如新建了一些目录放置一些文件等。
salloc -n 4 -p yuanyi
ssh yy01
cd /home/chengjie_chen/singularity_test
export PATH=/home/public/apps/singularity_ce_3.10.2/bin:$PATH
singularity pull tbtoolszone.sif docker://cjchen/tbtoolszone:2.0
# define a sandbox name for further ananlyses
singularity build --sandbox ./scauclassX tbtoolszone.sif
# get absolute path to the sandbox
currbox=`pwd`/scauclassX
singularity shell -H $currbox/root:/root -B `ls -d $currbox/*|while read file;do echo $file:/$(basename $file);done|grep -v :/etc|paste -sd,` scauclassX
# in singularity
source ~/.bashrc
# bind a new path, for example binding the currpath to /wkdir in the container
# -B `pwd`:/wkdir
singularity shell -H $currbox/root:/root -B `ls -d $currbox/*|while read file;do echo $file:/$(basename $file);done|grep -v :/etc|paste -sd,` -B `pwd`:/wkdir scauclassX
# in singularity
source ~/.bashrc
5. 可行解决方案之二
2022年暑期培训,我制备了一个 docker 镜像,基本全用了 conda
来安装,其中 miniconda 目录默认在/root
下,这个目录singularity会自动映射,其中用ENV
指令声明了docker镜像中 conda 路径。而对于一些二进制程序,我则直接放置在/usr/bin
下,这个目录 singularity 也会自动映射。
对于这类部署方式,可以直接用下述简单一个source
来解决。
singularity shell scauclass.sif
source /root/.bashrc
当然,注意到准备镜像是,不应该通过把export PATH=...
放在~/.bashrc
下来解决,这容易出现一些路径未映射。程序要放置也要放置在/root
目录下,这个目录是自动映射的。如此,要在.bashrc
中声明环境,那么最好给的是绝对路径。当然,我不清楚是否docker
的ENV
能都解决一些路径问题。目前来说ENV PATH=~/miniconda/bin:$PATH
是支持的...
当然,这个又对应了一个构建docker
镜像时,最好用Dockerfile
。这类似乎也只能ENV
来设置环境变量,或许也最能被singularity
兼容?
至于可行解决方案之一
或许最适合的是直接交互式构建docker image
。毕竟对于这一类,总是会出现一些程序需要声明到环境变量等....
想想还是有点意思。
6. 最佳实践
经过一段时间的实践,大体感受是,制备镜像的时候注意一下:
- conda 正常用,逻辑上最好也放在/opt 目录下
- 二进制软件,数据库,其他文件,全放在 /opt 下
/opt
目录会被自动挂载上去,也就是会替换宿主机目录,于是所有文件可以访问。
随后使用简单
singularity shell scauclass.sif
source /root/.bashrc
![](https://img.haomeiwen.com/i10518391/c85f125d973607ba.png)
网友评论