本篇介紹如何在 Linux 中安裝 Singularity 容器,並自行建立影像檔。

Singularity 的安裝過程需要自行從原始碼編譯,所以安裝過程會比較複雜一些,我的測試環境是 CentOS Linux 7.6 與 Ubuntu Linux 19.04,安裝的 Singularity 版本是 3.2,對於不同的 Linux 發行版,除了安裝系統套件的指令不同之外,其餘的安裝過程都相同。

安裝系統套件

安裝系統套件的指令會因為 Linux 發行版而有不同,請依照各自所屬的 Linux 發行版安裝對應的套件。

CentOS Linux

# 更新套件庫
sudo yum update

# 安裝開發者套件
sudo yum groupinstall 'Development Tools'

# 安裝必要套件
sudo yum install libarchive-devel wget openssl-devel libuuid-devel squashfs-tools

Ubuntu Linux

# 更新套件庫
sudo apt-get update

# 安裝必要套件
sudo apt-get install build-essential libssl-dev \
  uuid-dev libgpgme11-dev squashfs-tools wget git

安裝 Go

參考 Go 官方的說明,下載並安裝 Go:

# 下載並安裝 Go
wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.12.5.linux-amd64.tar.gz

~/.bashrc 中加入 PATH 的設定:

# 設定 PATH
export PATH=$PATH:/usr/local/go/bin

載入新的 PATH 設定:

# 載入新的 PATH 設定
source ~/.bashrc

測試 Go 是否安裝成功:

go version
go version go1.12.5 linux/amd64

安裝 Singularity

Singularity 的安裝方式有好幾種,最傳統的就是從原始碼編譯安裝:

# 下載 Singularity 原始碼
git clone https://github.com/sylabs/singularity.git

# 編譯 Singularity
cd singularity
./mconfig
make -C builddir

# 安裝 Singularity
sudo make -C builddir install

安裝好之後,測試是否可以正常執行:

# 查詢 Singularity 版本
singularity version
3.2.0-521.g3b81f65

除了自行編譯安裝之外,亦可使用 aptyum 安裝預先編譯好的版本:

# 使用 apt 安裝 Singularity
sudo wget -O- http://neuro.debian.net/lists/xenial.us-ca.full | sudo tee /etc/apt/sources.list.d/neurodebian.sources.list
sudo apt-key adv --recv-keys --keyserver hkp://pool.sks-keyservers.net:80 0xA5D32F012649A5A9
sudo apt-get update
sudo apt-get install singularity-container

# 使用 yum 安裝 Singularity
sudo yum update
sudo yum install epel-release
sudo yum update
sudo yum install singularity-runtime singularity

關於更詳細的安裝說明,請參考 Singularity 官方網站

使用影像檔

若要執行指定的 Singularity 影像檔,可以使用 run 指令,加上影像檔的位址:

# 執行 Singularity 影像檔
singularity run library://sylabsed/examples/lolcow
執行 Singularity 影像檔

執行 Singularity 影像檔

若想要開啟互動式的 shell 環境,可以使用 shell 指令:

# 在容器中開啟互動式 shell
singularity shell library://sylabsed/examples/lolcow

下載影像檔

若要下載 Singularity 的影像檔,可以使用 pull 指令:

# 下載 Singularity 影像檔
singularity pull library://sylabsed/examples/lolcow

Singularity 亦可直接下載 Docker 的影像檔:

# 下載 Docker 影像檔
singularity pull docker://godlovedc/lolcow

Singularity 會將下載的影像檔儲存為 SIF 檔案,可用 run 指令執行:

# 執行 Singularity 影像檔
singularity run lolcow_latest.sif

另外 SIF 檔案亦可直接執行:

# 直接執行 SIF 檔案
./lolcow_latest.sif

在容器中執行指令

若要在 Singularity 容器中執行特定的指令,可以使用 exec 指令:

# 在 Singularity 容器中執行 cowsay moo
singularity exec lolcow_latest.sif cowsay moo

檔案與管線

Singularity 在預設的狀況下會自動綁定 /home/$USER/tmp$PWD 這三個實體機器上的目錄,也就是說在 Singularity 容器中可以直接存取這三個目錄下的檔案:

# 建立 $HOME 下的檔案
echo "Hello, Singularity." > $HOME/hostfile.txt

# 於 Singularity 中存取 $HOME 下的檔案
singularity exec lolcow_latest.sif cat $HOME/hostfile.txt
Hello, Singularity.

資料除了以檔案傳遞之外,亦可直接透過管線(pipe)的方式,直接導入 Singularity 容器中:

# 使用管線傳遞資料進入 Singularity 容器
echo "Hello, Singularity." | singularity exec lolcow_latest.sif cowsay
 _____________________
< Hello, Singularity. >
 ---------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

自訂 Singularity 影像檔

建立沙箱目錄:

# 建立沙箱目錄
singularity build --sandbox ubuntu/ library://ubuntu

這樣可以將 ubuntu 這個 Singularity 影像檔解開,放在一個名稱為 ubuntu 的沙箱目錄中,我們可以使用 shellexecrun 指令來操作這個沙箱目錄,操作時若需要寫入資料,可以加上 --write 參數:

# 使用沙箱目錄自訂容器環境
singularity shell --writable ubuntu/

將環境準備好之後,再將其打包起來,變成一個新的 SIF 檔案:

# 將沙箱目錄打包成 SIF 檔案
singularity build new_ubuntu.sif ubuntu

Singularity 定義檔

另外一種自訂 Singularity 影樣檔的方式是使用定義檔,首先準備如下的定義檔 lolcow.def

BootStrap: library
From: ubuntu:16.04

%post
    apt-get -y update
    apt-get -y install fortune cowsay lolcat

%environment
    export LC_ALL=C
    export PATH=/usr/games:$PATH

%runscript
    fortune | cowsay | lolcat

%labels
    Author GodloveD

然後即可以既有的 Singularity 影像檔為基礎,建立新的影像檔:

# 以 Singularity 定義檔建立影像檔
sudo singularity build lolcow.sif lolcow.def