Singularity

警告

  • 该文档学习需要一定的计算机基础知识,建议先学习 WSL 、docker 部分知识,建议亲自上手尝试一下

  • Singularity 不支持在 Windows 上直接运行。需要在Linux环境下使用

  • 这个软件学习推荐指数:★★★★☆

  • Singularity 能够运行大部分docker 镜像,但是还是建议从最通用的 linux环境(ubuntu&redhat)下构建镜像

简介

Singularity 是一个开源的容器化平台,专为高性能计算 (HPC) 环境设计。它允许用户创建、运行和共享包含完整软件环境的容器,特别适合在集群环境中使用。与 Docker 不同,Singularity 强调安全性和兼容性,非常适合在共享计算资源上运行。

通过源码安装Singularity

警告

  • 接下来的操作,均在WSL环境下运行,请提前配置好相关的软件环境。

安装依赖

sudo apt install -y
    build-essential \
    libssl-dev \
    uuid-dev \
    libgpgme11-dev \
    squashfs-tools \
    libseccomp-dev \
    wget \
    pkg-config \
    git \
    cryptsetup

安装 Go

Singularity 需要 Go 语言环境。以下是安装 Go 的步骤:

# 切换到 root 用户
sudo -s
# 下载 Go
wget https://golang.org/dl/go1.19.5.linux-amd64.tar.gz

# 解压并安装
sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz

# 设置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

# 验证安装
go version

安装 Singularity

# 克隆 apptainer 仓库
git clone https://github.com/apptainer/apptainer.git
cd apptainer


# 编译并安装
./mconfig
cd builddir
make
sudo make install

# 验证安装
singularity --version

构建 Singularity 镜像

创建 Singularity 定义文件

Singularity 镜像是通过定义文件(.def)构建的。以下是一个简单的 Ubuntu 基础镜像定义文件示例:

# 创建定义文件目录
mkdir -p ~/singularity_defs
cd ~/singularity_defs

# 创建定义文件
cat > ubuntu.def << EOF
Bootstrap: docker
From: ubuntu:22.04

%post
    apt-get update && apt-get install -y \
build-essential \
git \
python3 \
python3-pip \

    # 安装 Python 包示例
    pip3 install numpy pandas matplotlib

%runscript
    echo "Hello from Singularity container!"
    exec "$@"
EOF

构建镜像

# 使用 sudo 构建镜像
sudo singularity build ubuntu.sif ubuntu.def

# 或者使用 fakeroot(推荐)
sudo singularity build --fakeroot ubuntu.sif ubuntu.def

沙盒模式构建镜像

沙盒模式允许你创建一个可读写的目录作为镜像,便于开发和测试:

# 切换root用户
sudo -s
# 使用沙盒模式构建镜像,从 Docker Hub 拉取 Ubuntu 22.04 镜像
singularity build --sandbox ubuntu_sandbox docker://ubuntu:22.04

# 在沙盒模式下进入镜像(可读写)
singularity shell --writable ubuntu_sandbox

# 或者使用 fakeroot (普通用户下)
singularity shell --fakeroot --writable ubuntu_sandbox

# 在沙盒中进行修改后,可将其转换为只读镜像
sudo singularity build --fakeroot ubuntu.sif ubuntu_sandbox

.def 文件与沙盒模式的区别

  1. 文件类型与结构

    • .def 文件:文本文件,定义了镜像的构建过程,包括基础镜像、安装的软件和运行脚本等。

    • 沙盒模式:创建一个实际的目录结构,包含完整的文件系统。

  2. 读写权限

    • 通过 .def 文件构建的镜像:默认是只读的(.sif 文件),无法直接修改。

    • 沙盒模式:创建的是可读写目录,可以直接修改其中的内容。

  3. 使用场景

    • .def 文件:适合生产环境,确保镜像的一致性和不可变性。

    • 沙盒模式:适合开发和测试阶段,可以快速修改和测试镜像内容。

  4. 转换关系

    • .def 文件可以用来构建沙盒镜像。

    • 沙盒镜像可以转换为只读的 .sif 镜像。

验证镜像

# 运行镜像
singularity run ubuntu.sif

# 进入镜像交互式环境
singularity shell ubuntu.sif

# 执行镜像中的命令
singularity exec ubuntu.sif python3 -c "import numpy; print(numpy.__version__)"

将镜像上传到集群并使用

上传镜像到集群

可以使用 SCP 命令将本地构建的 Singularity 镜像上传到集群:

备注

需要设置一些Linux的环境信息,以便后续的调试,参考 : 推荐环境设置(进阶)

# 上传到集群1
scp ubuntu.sif <集群账号>@login01:~

# 上传到集群2
scp ubuntu.sif <集群账号>@admin:~

在集群上使用 Singularity 镜像

在集群上运行 Singularity 容器:

# 激活 Singularity 模块(选择对应命令运行)
module load apps/singularity # 集群1
module load singularity # 集群2

# 运行镜像
singularity run ubuntu.sif

# 进入交互式环境
singularity shell ubuntu.sif

# 执行命令
singularity exec ubuntu.sif python3 -c "print('Hello from cluster!')"

参考资料

Contributor:rkwu


最后更新: 2025 年 12 月 15 日