Py学习  »  docker

踩坑 | docker 镜像转换为 singularity 容器

生信石头 • 1 年前 • 144 次点击  

前述,我用 docker 制备了一个汇集多个生信软件的容器,其中一部分软件直接用apt-get install XXXX 完成。这部分软件,理所当然会自动映射绕容器的/usr/bin目录。对应的,当docker镜像转换为 singularity 容器后,我们可以直接在singularity shell YYYY.sif 后直接访问对应程序。
但是,我还有一份部分软件,为了方便,全部放在docker镜像中的/home/softwares目录下。这个目录对于docker容器没啥问题,因为路径上下文是固定的,无论到哪个服务器上。但对于singularity来说,shell进去后,路径还是原来的路径,同时也并不会映射/home/softwares。 简单来说,就是这部分软件不容易访问,同时在.bashrcexport PATH也会失效,类似的逻辑上/usr/bin下的软连接同样会失效。
对于此,我开始思考,那么conda的就不会失效?因为home目录是不对的。逻辑上,singularityhome默认为宿主机home

简单检索一下,大体如下,
1. 相关注意事项

2. 另一个相关注意事项

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 yuanyissh yy01cd /home/chengjie_chen/singularity_testexport PATH=/home/public/apps/singularity_ce_3.10.2/bin:$PATHsingularity pull tbtoolszone.sif docker://cjchen/tbtoolszone:2.0# define a sandbox name for further ananlysessingularity build --sandbox ./scauclassX tbtoolszone.sif# get absolute path to the sandboxcurrbox=`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 singularitysource ~/.bashrc
# bind a new path, for example binding the currpath to /wkdir in the container# -B `pwd`:/wkdirsingularity 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 singularitysource ~/.bashrc

5. 可行解决方案之二

2022年暑期培训,我制备了一个 docker 镜像,基本全用了 conda 来安装,其中 miniconda 目录默认在/root下,这个目录singularity会自动映射,其中用ENV指令声明了docker镜像中 conda 路径。而对于一些二进制程序,我则直接放置在/usr/bin下,这个目录 singularity 也会自动映射。
对于这类部署方式,可以直接用下述简单一个source来解决。

singularity shell scauclass.sifsource /root/.bashrc

当然,注意到准备镜像是,不应该通过把export PATH=...放在~/.bashrc下来解决,这容易出现一些路径未映射。程序要放置也要放置在/root目录下,这个目录是自动映射的。如此,要在.bashrc中声明环境,那么最好给的是绝对路径。当然,我不清楚是否dockerENV能都解决一些路径问题。目前来说ENV PATH=~/miniconda/bin:$PATH是支持的...
当然,这个又对应了一个构建docker镜像时,最好用Dockerfile。这类似乎也只能ENV来设置环境变量,或许也最能被singularity兼容?
至于可行解决方案之一或许最适合的是直接交互式构建docker image。毕竟对于这一类,总是会出现一些程序需要声明到环境变量等....
想想还是有点意思。

6. 最佳实践

经过一段时间的实践,大体感受是,制备镜像的时候注意一下:

  1. conda 正常用,逻辑上最好也放在/opt 目录下

  2. 二进制软件,数据库,其他文件,全放在 /opt 下

/opt目录会被自动挂载上去,也就是会替换宿主机目录,于是所有文件可以访问。
随后使用简单

singularity shell scauclass.sifsource /root/.bashrc

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/153433
 
144 次点击