美文网首页
踩坑 | docker 镜像转换为 singularity 容器

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

作者: 生信石头 | 来源:发表于2023-04-10 18:24 被阅读0次

前述,我用 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 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中声明环境,那么最好给的是绝对路径。当然,我不清楚是否dockerENV能都解决一些路径问题。目前来说ENV PATH=~/miniconda/bin:$PATH是支持的...
当然,这个又对应了一个构建docker镜像时,最好用Dockerfile。这类似乎也只能ENV来设置环境变量,或许也最能被singularity兼容?
至于可行解决方案之一或许最适合的是直接交互式构建docker image。毕竟对于这一类,总是会出现一些程序需要声明到环境变量等....
想想还是有点意思。

6. 最佳实践

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

  1. conda 正常用,逻辑上最好也放在/opt 目录下
  2. 二进制软件,数据库,其他文件,全放在 /opt 下

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

singularity shell scauclass.sif
source /root/.bashrc

相关文章

  • 工具 | Apptainer 就是 Singularity

    在 CJ 的进阶 | 本地「Docker」镜像转换为「Singularity」镜像,直接运行于任何服务器~[htt...

  • Singularity入门之运行容器

    下载已存在镜像 和Docker类似,要运行 Singularity 也需要先获取镜像,Singularity 可以...

  • Docker容器——导出与导入镜像

    Docker容器——导出与导入镜像 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o)...

  • Docker容器——重命名镜像的TAG

    Docker容器——重命名镜像的TAG 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)...

  • 进阶 | 本地「Docker」镜像转换为「Singularity

    写在前面 近期,组织了第三期暑期培训,想想也有四个年头。另外,分别给本科生和硕士生均分别讲过一学期的生物信息数据分...

  • docker相关概念理解

    Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。 Docker 容器(...

  • Docker容器——查找自己想要的镜像和使用

    Docker容器——查找自己想要的镜像和使用 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯...

  • Docker

    [TOC] 使用 Docker 镜像 下载镜像 列出镜像 构建镜像 删除本地镜像 操作 Docker 容器 容器是...

  • Docker命令及实战

    常用Docker命令 docker容器信息 镜像操作 镜像搜索 镜像下载 删除镜像 容器操作 提示:对于容器的操作...

  • Docker Registry安装

    之前一直使用Nexus管理Docker镜像,后期发现Nexus对于Docker的支持并不是很完善,踩了许多坑(踩过...

网友评论

      本文标题:踩坑 | docker 镜像转换为 singularity 容器

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