社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

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

生信石头 • 2 年前 • 375 次点击  

前述,我用 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
 
375 次点击