Singularity (SingularityCE, Apptainer)

By | 7月 18, 2026

为什么 HPC 喜欢 Singularity?

HPC 是 High Performance Computing,通常是很多服务器组成的集群。

Docker 很流行,为啥 HPC cluster 不喜欢?

运行 docker 首先要起 docker deamon,它需要 root 权限。用户运行的 CLI 是发给 docker daemon,由它来 run/start/stop 等管理 container。

User
  │
docker CLI
  │
docker daemon (root)
  │
Container

在大学超算中心、EDA Farm、Slurm 集群中:

  • 几百甚至几千用户共用服务器
  • 不希望用户获得 root 权限
  • 需要严格资源隔离

Singularity 以当前用户身份运行 image

User
  │
singularity exec
  │
Container

// example
singularity exec image.sif my_app

Singularity 的 image 是单个文件,容易复制、校验和发布。

一句话总结:Docker 是为“部署应用”设计的,而 Singularity(Apptainer)是为“在共享 HPC 环境中安全运行应用”设计的。

Singularity 的发展

Singularity 由美国 Lawrence Berkeley National Laboratory (LBNL) 的 Gregory Kurtzer 发起开发,最早发布于 2015 年。

时间事件
2015Singularity 首次发布,面向 HPC 集群
2016~2017被越来越多超算中心采用
2018成立 Sylabs 公司,发布 SingularityCE 和 SingularityPRO (收费)
2021社区担心被厂商控制,从 Singularity 分叉出 Apptainer(Linux Foundation 项目)
2022Apptainer 1.0 正式发布
现在HPC 领域多数新项目优先使用 Apptainer,Sylabs 继续维护 SingularityPRO 商业产品

Singularity 的使用

安装 Singularity

Singularity 是专门为 Linux 设计的,需要 root 权限,参照官方文档安装。

Windows 不能直接安装,需要先安装这些:

Build SIF image

Singularity 有自己的 Definition File 格式,然后再 build 成一个 SIF image,类似 Dockerfile => image。

但是通常不这么用,很多企业同时用到 Docker 和 Singularity,统一使用 Dockerfile

  • Dockerfile build 后生成 Docker image。
  • Singularity 从 Docker image 生成 SIF image。

从 Docker image 生成 SIF image 的命令:

// 1. remote docker image uri
singularity build myapp.sif docker://myrepo.com/myapp:latest

// 2. local docker image (docker daemon is running)
singularity build myapp.sif docker-daemon://myapp:latest

// 3. docker saved TAR image
singularity build myapp.sif docker-archive://myapp.tar

Writable image (–sandbox)

先生成 folder,再从 folder 生成 SIF。类似在 docker container 里安装各种东西,然后从 container 生成 image。

公司内网 HPC Cluster 不能访问外网,apt update 执行失败。还是从 laptop 的 docker 生成需要的 image 方便些,然后传给 Singularity。

// 1.1 从 docker 生成 ubuntu-dev 目录
sudo singularity build --sandbox ubuntu-dev docker://ubuntu:24.04
// 1.2 从 SIF image 生成 ubuntu-dev 目录
sudo singularity build --sandbox  myapp.sif

// 2. 修改 ubuntu-dev
sudo singularity shell --writable ubuntu-dev
apt update
apt install -y vim git openjdk-21-jdk

// 3. build SIF iamge
sudo singularity build myapp.sif ubuntu-dev

Foreground 运行 SIF

Foreground 运行 SIF image,就是起一个进程,退出了进程就结束了。

Singularity 默认会看到很多宿主目录(如 /home/tmp、NFS 等),所以 HPC 场景特别喜欢用 exec.

// 1. interactive shell. Run 'exit' to quit.
singularity shell ubuntu.sif

// 2. run a command. It can access host machine mounted storage.
singularity exec myapp.sif java -jar /opt/app/app.jar

// 3. run image default CMD (Entry Point)
singularity run myapp.sif

Background 运行 SIF

Instance 就是 Singularity 后台长期运行的 container。主要用于:

  • Web Server
  • Database
  • REST API
  • Jupyter Notebook
  • 长时间运行的 Java 服务

普通 user 只能管理(看到)自己的 instance,root user 可以看到所有人的 instance。

// 1. 启动 instance
singularity instance start myapp.sif myapp

// 2. 查看 instance
singularity instance list

// 3. 进入 instance,执行 exit 退出,instance 还在
singularity shell instance://myapp

// 4. 在 instace 中执行命令
singularity exec instance://myapp java -jar /opt/app/app.jar
singularity exec instance://myapp ps -ef

// 5. 停止 instance,停止后这个 instance 就不在了
singularity instance stop myapp

绑定宿主目录

Singularity 通常会自动绑定:

  • $HOME
  • /tmp
  • /var/tmp
  • /proc
  • /sys
  • /dev
  • 当前工作目录

有些管理员还会配置 /nfs, /gpfs, /scratch 等。

但并不是所有机器配置都一样,为了保证命令在哪都能重复执行,就用 --bind / -B 映射 host 目录。

// foreground
singularity exec \
  -B /data/project:/workspace \
  myapp.sif

// background
singularity instance start \
    --bind /nfs/data:/data \
    myapp.sif \
    myapp