4.1 KiB
apptainerce_build
为了创建一个模块化、易于维护的 Shell 脚本来自动安装 Apptainer (SingularityCE 的社区版本),我们可以将脚本分为几个部分:安装依赖、安装 Go、下载和编译 Apptainer,以及卸载功能。同时,我们将使用变量来控制版本号和下载链接,使得维护和更新更加方便。
apptainer
Singularity和Apptainer 区别
Singularity和Apptainer是同一款软件的不同版本。Singularity是一款流行的容器技术,专为高性能计算(HPC)和数据密集型应用设计。它允许用户在单个文件中打包软件应用程序和所有相关的依赖项,以便在其他系统上无缝运行。
然而,Singularity的开发和维护是由Sylabs进行的,这是一家商业公司。在2021年,Sylabs决定将Singularity的开发转向更商业化的方向,这引发了社区的一些争议。
为了保持Singularity的开源和社区驱动的本质,Singularity的原始开发者和社区成员决定创建一个新的项目,名为Apptainer。Apptainer是Singularity的一个分支,其目标是继续开发和维护一个完全开源和社区驱动的容器技术。
总的来说,Singularity和Apptainer都是相同的容器技术,只是由于开发和维护的策略差异,导致了两个不同的项目。
Apptainer封装原则
-
数据库,容器分离原则,降低耦合度,复用数据库。
-
编译和封装分离原则,软件编译可以在容器内也可以在容器外,编译完再安装到全新的基础镜像。
-
尽量使用编译型语言写脚本,可以减小容器体积,Python,Perl 等解释器也会占不少体积。
-
保持版本记录,每个镜像文件都匹配一个Definition文件,里面能标注准确标注版本号就尽量标注。
-
如果需要使用 conda,选择 micromamba。
首先,生物信息数据分析属于 HPC 计算范畴,很适合集群环境,容器可以隔离每个软件的运行环境,让不同软件拥有独立的依赖关系,其实 Conda 也可以做到环境的隔离,但是 conda 有其自身的问题,这里不讨论。可以选择 Docker(https://www.docker.com/) 或者 Apptainer(https://apptainer.org/,先前叫 Singularity ), 根据文章标题可以看出,最后推荐 Apptainer,几点好处:
-
可以生成单一的 sif 文件,方便直接以文件的形式部署和分享,在服务集群上各个节点可以直接调用容器。
-
可以直接使用 DockerHub 的 镜像生成 sif 文件
-
使用 alpine 直接使用编译后的文件,可以将镜像文件做的很小,接近 2M 左右。
-
创建和使用容器不再需要管理员权限。
几点心得:
-
尽量使用国内镜像。
-
构建本地的 HTTP 服务器,保证构建镜像构建过程稳定。
-
非通用的数据库,数据库可以考虑和容器打包放在一起,版本也好控制。
-
一些软件可能不无法在 alpine 基础进行安装成功,比如 BLAST
-
推荐 Rocky Linux 9.2 基础镜像,体积大约 60M
-
如果封装 R 程序, 可以使用 r-base 基础镜像库,体积比较小。
-
能用编译型编程语言写程序尽量不用解释型语言写,安装额外的语言执行环境会让容器体积变大。
-
学会自己构建镜像,Github 上提供的 Dockerfile 不一定会真的工作。
使用Apptainer本地镜像文件构建容器
使用本地镜像文件会出现:
- 网络稳定性问题
- 镜像文件太大,导致传输失败
基础镜像
alpine https://hub.docker.com/_/alpine,体积只有 **3M**
RockyLinux https://hub.docker.com/_/rockyinux
Ubuntu https://hub.docker.com/_/ubuntu
CentOS https://hub.docker.com/_/centos
R-base https://hub.docker.com/_/r-base
使用 Docker Hub 的基础镜像无法正常构建容器,应该是 DNS 问题导致,这类网络导致的问题其实挺麻烦,解决的问题的最佳方案就是本地化基础镜像库。