Singularity/Apptainer容器是否支持中间构建检查点?
Singularity/Apptainer 迭代构建的解决方案
Singularity/Apptainer 默认确实没有Docker那样自动的增量构建机制,但可以通过以下几种方式实现类似中间检查点的效果,避免每次都从头构建:
使用沙箱模式迭代
先以沙箱格式构建镜像,沙箱是一个可修改的目录结构,后续修改定义文件后可以基于沙箱更新,不用重新执行所有步骤:# 第一次构建沙箱 apptainer build --sandbox my_sandbox/ my_def.def # 修改定义文件后,更新沙箱(只执行新增/修改的步骤) apptainer build --sandbox --update my_sandbox/ my_def.def # 最终确认后,从沙箱打包成只读的sif镜像 apptainer build final_image.sif my_sandbox/拆分定义文件为基础镜像+上层镜像
把耗时的步骤(比如安装大型依赖、编译核心软件)单独写在一个基础定义文件里,构建成基础镜像后,后续的迭代都基于这个基础镜像做增量修改:- 编写
base.def,包含所有耗时的基础步骤,构建出base.sif:apptainer build base.sif base.def - 新的迭代定义文件
dev.def开头引用基础镜像,只添加新的步骤:From: base.sif %post # 这里只写新增的命令,比如安装小工具、配置环境等 apt-get install -y nano echo "export PATH=/new/path:$PATH" >> $SINGULARITY_ENVIRONMENT - 每次修改
dev.def后,构建时只会执行新增的步骤,复用基础镜像的内容:apptainer build dev_image.sif dev.def
- 编写
利用缓存减少重复下载
使用--cache-dir指定缓存目录,构建时会缓存下载的基础镜像、rpm/deb包等,避免重复下载耗时的资源:apptainer build --cache-dir ./my_build_cache my_image.sif my_def.def
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

