Singularity 是一種流行的容器技術(shù)氯哮,專為高性能計(jì)算(HPC)和科學(xué)計(jì)算應(yīng)用設(shè)計(jì)老速。與 Docker 等其他容器技術(shù)不同贞绵,Singularity 可以直接在用戶空間中運(yùn)行者祖,而不需要特權(quán)或守護(hù)進(jìn)程孵构。這使得 Singularity 在 HPC 環(huán)境中非常受歡迎屁商,因?yàn)檫@些環(huán)境通常對(duì)安全性和多用戶支持有嚴(yán)格的要求。
singularity 容器的優(yōu)點(diǎn)包括:
- 不需要 sudo 權(quán)限即可運(yùn)行(與 Docker 不同)颈墅;
- 在多節(jié)點(diǎn)環(huán)境中與 HPC 資源管理器很好地互操作蜡镶;
- 默認(rèn)情況下,輕松利用集群或服務(wù)器上的 GPU恤筛、高速網(wǎng)絡(luò)帽哑、并行文件系統(tǒng);
- 能夠?qū)?Docker 鏡像轉(zhuǎn)換為 Singularity叹俏。
系統(tǒng)安裝
$ 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的使用主要分為三步:拉绕拚怼(或構(gòu)建)鏡像,使用鏡像粘驰,以及刪除鏡像屡谐。以下是這些步驟的詳細(xì)說(shuō)明:
1. 拉取(或構(gòu)建)鏡像
可以從Singularity Hub或Docker Hub拉取預(yù)構(gòu)建的鏡像蝌数,也可以使用定義文件從頭開(kāi)始構(gòu)建自己的鏡像愕掏。
以下是從Docker Hub拉取一個(gè)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
這會(huì)將Docker的ubuntu鏡像保存為一個(gè)Singularity鏡像文件,名為ubuntu_latest.sif
顶伞。
如果想從頭開(kāi)始構(gòu)建自己的鏡像饵撑,需要?jiǎng)?chuàng)建一個(gè)定義文件,然后使用singularity build
命令唆貌。定義文件可能如下所示:
Bootstrap: docker
From: ubuntu:18.04
%post
apt-get update && apt-get install -y python
然后滑潘,可以使用以下命令構(gòu)建鏡像:
sudo singularity build my_image.sif my_def.def
在這個(gè)例子中,my_image.sif
是輸出的鏡像文件锨咙,my_def.def
是定義文件语卤。
2. 使用鏡像
一旦有了一個(gè)Singularity鏡像,可以使用singularity shell
,singularity exec
粹舵,或singularity run
命令來(lái)使用它钮孵。
例如,以下命令會(huì)在一個(gè)Ubuntu鏡像中啟動(dòng)一個(gè)shell:
singularity shell ubuntu_latest.sif
也可以直接執(zhí)行鏡像中的命令眼滤,如下所示:
singularity exec ubuntu_latest.sif echo "Hello, world!"
singularity run 命令用于運(yùn)行 Singularity 容器的默認(rèn)運(yùn)行腳本巴席。這個(gè)腳本是在容器的構(gòu)建過(guò)程中定義的,通常用于啟動(dòng)應(yīng)用程序或服務(wù)诅需。
例如情妖,如果Singularity 容器包含一個(gè) web 服務(wù)器,可以使用 singularity run 命令來(lái)啟動(dòng)它:
singularity run my_web_server.sif
### 這個(gè)命令會(huì)運(yùn)行 my_web_server.sif 容器的默認(rèn)運(yùn)行腳本诱担,該腳本應(yīng)該啟動(dòng) web 服務(wù)器毡证。
其他
# shell方法
singularity shell ubuntu.latest.sif
# -B 參數(shù)與docker run的-v參數(shù)類似
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. 刪除鏡像
刪除一個(gè)Singularity鏡像就像刪除一個(gè)普通的文件那樣簡(jiǎn)單。只需要使用rm
命令:
rm ubuntu_latest.sif
這將會(huì)刪除ubuntu_latest.sif
鏡像蔫仙。
這些步驟涵蓋了Singularity的基礎(chǔ)使用料睛。
在Singularity中使用環(huán)境變量和掛載主機(jī)目錄的方法如下:
使用環(huán)境變量
在Singularity容器中使用環(huán)境變量,可以在定義文件中使用%environment
部分來(lái)設(shè)置環(huán)境變量摇邦。例如:
Bootstrap: docker
From: ubuntu:18.04
%environment
export MYVAR="Hello, world!"
這將在容器環(huán)境中創(chuàng)建一個(gè)名為MYVAR
的環(huán)境變量恤煞,其值為"Hello, world!"。
也可以在啟動(dòng)容器時(shí)使用-e
或--cleanenv
選項(xiàng)清除所有環(huán)境變量施籍,然后使用-E
或--env
選項(xiàng)設(shè)置新的環(huán)境變量居扒。例如:
singularity exec --cleanenv --env MYVAR="Hello, world!" my_image.sif echo $MYVAR
這會(huì)在一個(gè)清潔的環(huán)境中運(yùn)行容器,其中只有一個(gè)名為MYVAR
的環(huán)境變量丑慎。
掛載主機(jī)目錄
Singularity允許容器中掛載主機(jī)文件系統(tǒng)的目錄喜喂。可以使用-B
或--bind
選項(xiàng)來(lái)實(shí)現(xiàn)這一點(diǎn)竿裂。例如:
-B 參數(shù)與docker run的-v參數(shù)類似
singularity exec -B /path/to/host/dir:/path/to/container/dir my_image.sif ls /path/to/container/dir
這會(huì)將主機(jī)上的/path/to/host/dir
目錄掛載到容器的/path/to/container/dir
目錄玉吁,然后在容器中列出該目錄的內(nèi)容。
也可以在定義文件中使用%files
部分來(lái)復(fù)制文件或目錄到容器腻异。例如:
Bootstrap: docker
From: ubuntu:18.04
%files
/path/to/host/file /path/to/container/file
這將在構(gòu)建容器時(shí)將主機(jī)上的/path/to/host/file
復(fù)制到容器的/path/to/container/file
进副。
直接設(shè)置運(yùn)行環(huán)境
比如我外部Linux的運(yùn)行目錄為/home/xxxx,直接設(shè)置下面的Singularity環(huán)境即可讓Singularity里面的軟件識(shí)別到外界的環(huán)境
export SINGULARITY_BIND="/home/xxxx" ### 可以加載到bashrc
singularity exec my_image.sif ls /home/xxxx