本篇介紹如何在 Linux 中安裝 Singularity 容器,並自行建立影像檔。
Singularity 的安裝過程需要自行從原始碼編譯,所以安裝過程會比較複雜一些,我的測試環境是 CentOS Linux 7.6 與 Ubuntu Linux 19.04,安裝的 Singularity 版本是 3.2,對於不同的 Linux 發行版,除了安裝系統套件的指令不同之外,其餘的安裝過程都相同。
安裝系統套件的指令會因為 Linux 發行版而有不同,請依照各自所屬的 Linux 發行版安裝對應的套件。
# 更新套件庫 sudo yum update # 安裝開發者套件 sudo yum groupinstall 'Development Tools' # 安裝必要套件 sudo yum install libarchive-devel wget openssl-devel libuuid-devel squashfs-tools
# 更新套件庫 sudo apt-get update # 安裝必要套件 sudo apt-get install build-essential libssl-dev uuid-dev libgpgme11-dev squashfs-tools wget git
參考 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 原始碼 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
除了自行編譯安裝之外,亦可使用 apt
或 yum
安裝預先編譯好的版本:
# 使用 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
若想要開啟互動式的 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 build --sandbox ubuntu/ library://ubuntu
這樣可以將 ubuntu
這個 Singularity 影像檔解開,放在一個名稱為 ubuntu
的沙箱目錄中,我們可以使用 shell
、exec
或 run
指令來操作這個沙箱目錄,操作時若需要寫入資料,可以加上 --write
參數:
# 使用沙箱目錄自訂容器環境
singularity shell --writable ubuntu/
將環境準備好之後,再將其打包起來,變成一個新的 SIF 檔案:
# 將沙箱目錄打包成 SIF 檔案
singularity build new_ubuntu.sif ubuntu
另外一種自訂 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