Singularity 容器
Singularity 是一种流行的容器技术,专为高性能计算(HPC)和科学计算应用设计。与 Docker 等其他容器技术不同,Singularity 可以直接在用户空间中运行,而不需要特权或守护进程。这使得 Singularity 在 HPC 环境中非常受欢迎,因为这些环境通常对安全性和多用户支持有严格的要求。
singularity 容器的优点包括:
- 不需要 sudo 权限即可运行(与 Docker 不同);
- 在多节点环境中与 HPC 资源管理器很好地互操作;
- 默认情况下,轻松利用集群或服务器上的 GPU、高速网络、并行文件系统;
- 能够将 Docker 镜像转换为 Singularity。
系统安装
$ sudo apt-get update && sudo apt-get install -y \
build-essential \
libssl-dev \
uuid-dev \
libgpgme11-dev \
squashfs-tools \
libseccomp-dev \
pkg-config
$ sudo yum update -y && \
sudo yum groupinstall -y 'Development Tools' && \
sudo yum install -y \
openssl-devel \
libuuid-devel \
libseccomp-devel \
wget \
squashfs-tools
Singularity的使用主要分为三步:拉取(或构建)镜像,使用镜像,以及删除镜像。以下是这些步骤的详细说明:
1. 拉取(或构建)镜像
可以从Singularity Hub或Docker Hub拉取预构建的镜像,也可以使用定义文件从头开始构建自己的镜像。
以下是从Docker Hub拉取一个Ubuntu镜像的例子:
singularity pull docker://ubuntu
singularity pull sub://ubuntu:latest
# 从docker hub中pull
singularity pull docker://ubuntu:latest
# pull并保存镜像文件
singularity pull ubuntu.latest.sif sub://ubuntu:latest
这会将Docker的ubuntu镜像保存为一个Singularity镜像文件,名为ubuntu_latest.sif
。
如果想从头开始构建自己的镜像,需要创建一个定义文件,然后使用singularity build
命令。定义文件可能如下所示:
Bootstrap: docker
From: ubuntu:18.04
%post
apt-get update && apt-get install -y python
然后,可以使用以下命令构建镜像:
sudo singularity build my_image.sif my_def.def
在这个例子中,my_image.sif
是输出的镜像文件,my_def.def
是定义文件。
2. 使用镜像
一旦有了一个Singularity镜像,可以使用singularity shell
,singularity exec
,或singularity run
命令来使用它。
例如,以下命令会在一个Ubuntu镜像中启动一个shell:
singularity shell ubuntu_latest.sif
也可以直接执行镜像中的命令,如下所示:
singularity exec ubuntu_latest.sif echo "Hello, world!"
singularity run 命令用于运行 Singularity 容器的默认运行脚本。这个脚本是在容器的构建过程中定义的,通常用于启动应用程序或服务。
例如,如果Singularity 容器包含一个 web 服务器,可以使用 singularity run 命令来启动它:
singularity run my_web_server.sif
### 这个命令会运行 my_web_server.sif 容器的默认运行脚本,该脚本应该启动 web 服务器。
其他
# shell方法
singularity shell ubuntu.latest.sif
# -B 参数与docker run的-v参数类似
singularity shell -B /data:/data ubuntu.latest.sif
# run方法
singularity run ubuntu.latest.sif
# exec方法
singularity exec --containall --bind ${cwd}:${docker_cwd} ubuntu.latest.sif /bin/bash script.sh
3. 删除镜像
删除一个Singularity镜像就像删除一个普通的文件那样简单。只需要使用rm
命令:
rm ubuntu_latest.sif
这将会删除ubuntu_latest.sif
镜像。
这些步骤涵盖了Singularity的基础使用。
在Singularity中使用环境变量和挂载主机目录的方法如下:
使用环境变量
在Singularity容器中使用环境变量,可以在定义文件中使用%environment
部分来设置环境变量。例如:
Bootstrap: docker
From: ubuntu:18.04
%environment
export MYVAR="Hello, world!"
这将在容器环境中创建一个名为MYVAR
的环境变量,其值为"Hello, world!"。
也可以在启动容器时使用-e
或--cleanenv
选项清除所有环境变量,然后使用-E
或--env
选项设置新的环境变量。例如:
singularity exec --cleanenv --env MYVAR="Hello, world!" my_image.sif echo $MYVAR
这会在一个清洁的环境中运行容器,其中只有一个名为MYVAR
的环境变量。
挂载主机目录
Singularity允许容器中挂载主机文件系统的目录。可以使用-B
或--bind
选项来实现这一点。例如:
-B 参数与docker run的-v参数类似
singularity exec -B /path/to/host/dir:/path/to/container/dir my_image.sif ls /path/to/container/dir
这会将主机上的/path/to/host/dir
目录挂载到容器的/path/to/container/dir
目录,然后在容器中列出该目录的内容。
也可以在定义文件中使用%files
部分来复制文件或目录到容器。例如:
Bootstrap: docker
From: ubuntu:18.04
%files
/path/to/host/file /path/to/container/file
这将在构建容器时将主机上的/path/to/host/file
复制到容器的/path/to/container/file
。