singularity

一、singularity 安裝

通過以下命令可以安裝singularity

git clone https://github.com/singularityware/singularity.git

cd singularity

./autogen.sh

./configure --prefix=/usr/local

make

sudo make install

在執行 ./autogen.sh 時,可能會出現如下報錯

此時需要執行以下命令,安裝相應的依賴

sudo apt-get install -y build-essential libtool autotools-dev automake autoconf

安裝后,可以運行singularity --help來驗證是否安裝成功,以及查看相關指令介紹


二、創建singularity鏡像

方法一:通過singularity create指令創建一個空鏡像(可以通過--size參數指定該鏡像的大小或通過singularity expand增大實例化后的容器)。然后通過singularity import指令向該空鏡像導入一個鏡像。(點擊查看更多關于singularity create的內容

通過singularity create test1.img指令,創建了一個名為test1.img的鏡像,并指定該鏡像的大小為1000.注意到該操作需要獲取root權限。

創建出test1.img鏡像后,通過singularity import命令向該鏡像中導入一個docker鏡像。如下,向創建的test1.img中導入一個ubuntu docker鏡像。

方法二:創建一個空鏡像后,可以為其創建一個bootstrap定義文件(類似于dokcer 中dockerfile文件的概念),然后通過singularity bootstrap指令來基于該定義文件對空鏡像進行修改。

如下,通過vim創建一個定義文件,命名為Singularity(不一定要命名為Singularity,但如果想要將創建好的鏡像通過singularity hub分享,則必須命名為Singularity)。

該文件中的前兩句指定了要從Docker 倉庫中pull 一個ubuntu鏡像;%runscript中的指令,會在運行singularity run指令時被執行(singularity run指令會在后面介紹,類似于docker run指令);%post中的指令,會在運行singularity bootstrap時被執行,只執行一次,這里通常放置一些安裝軟件或依賴等的指令。

創建Singularity文件后,接下來創建一個空鏡像test2.img,然后通過singularity bootstrap test2.img Singularity指令來使用剛剛創建的Singularity文件對test2.img進行修改。之后,運行singularity run test2.img,可以在命令行中看到相應的輸出,正是在Singularity文件中的%runscript部分里定義的輸出,說明成功地bootstrap了test2.img鏡像。


bootstrap定義文件主要包括兩部分,Header部分和Sections部分。

在Header部分中,指定了容器的基礎操作系統,類似于Dokcerfile中的基礎鏡像部分。其中的Bootstrap字段指定了以何種方式下載基礎鏡像,比如在上面的例子中,Bootstrap字段被指定為docker,因此會從docker倉庫中下載基礎鏡像。除此之外,該字段還有yum、debootstrap和arch等值。不同的bootstrap值會跟隨不同的其他字段。這里以bootstrap:docker為例,跟隨了From、IncludeCmd、Registry和Token等其他字段。其中From字段,用于指定基礎鏡像的名字,格式為[name]:[version],當不指定[version]時,默認為[name]:[latest]。在上面的例子中,From字段的值為ubuntu:latest,因此會下載一個最新版本的ubuntu鏡像。IncludeCmd字段用于指定,當沒有顯式指定%runscript的內容時,是否將基礎鏡像的Dokcerfile中定義的CMD指令設置為%runscript中的內容。(點擊查看更多關于Header部分的具體介紹

除了Header部分,在bootstrap定義文件中,還包括多個可選的section,各個section的名字以字符%開頭。前面已經介紹了%runscript和%post兩個section,前者定義了對鏡像執行singularity run時,會被運行的指令;后者定義了對鏡像執行bootstrap時,會被運行的指令,只運行一次,被用來下載容器內部的相關軟件或依賴;除此之外,還有%setup和%test兩個section(點擊查看關于這兩個section的具體介紹


方法三:通過singulaity pull指令從 Singularity Hub上下載鏡像(singularity pull 指令必須在root權限下執行)。

Singularity Hub類似于Dokcer Hub的概念,是用來上傳和下載鏡像的在線倉庫。如下所示,使用singularity pull ,并指定鏡像的路徑。當從Singularity Hub上下載時,路徑的前綴是shub://。

pull的時候提示訪問不了,且在singularity user document中,支持的URIS好像只有http://、https://、docker://(最后一個運行的是非持久化的)(點擊查看更多

三、對singularity鏡像的操作

主要有四種操作:run、exec、shell和test(test不常用)。可以在命令行中通過--help參數查看各個指令的文檔,比如singularity run --help,可以查看run指令的操作文檔。

singularity run --help查看run指令的相關文檔

run指令

格式為singularity (options) run [container image] (options),執行該指令時,會運行鏡像的定義文件中%runscript內指定的指令。若沒有%runscript,則啟動一個默認的shell。(點擊查看更多

關于%runscript,如果在Singularity文件中有指定,則%runscript為該指定內容;如果沒有指定,或者創建鏡像時采用的是singularity import的方法(此時沒有Singularity文件),則默認%runscript是基礎鏡像中ENTRYPOINT中的指令;如果在Singularity文件中沒有指定,IncludeCmd字段的值為yes,則將基礎鏡像中CMD下的指令設置為%runscript的內容。(點擊查看更多

在前面的介紹中,可以看到,對test2.img運行singularity run時,會執行%runscript中的指令。

exec指令

格式為singularity (options)exec [container image] [command] (options),使用該指令,可以在外部主機上將指定的command運行在指定的容器內。

shell指令

格式為singularity (options)shell [container image] (options),使用該指令時,可以在容器內啟動一個shell,因此可以在容器外部與容器內部進行交互操作。運行exit則可以退出該shell;當指定了--writebale參數時,可以對容器進行修改,此時需要有root權限;當container image指定的不是一個本地鏡像,而是以docker://為前綴的遠程鏡像時,該指令會運行一個非持續的容器,當exit該shell時,容器會被自動刪除。(點擊查看更多

可以看到,進入container后,運行ls時,列出的是外部主機當前工作目錄下的內容,這是因為singulairty容器默認綁定的用戶的home目錄(以sudo身份和不以sudo身份運行shell,默認的綁定是不同的)(點擊查看更多相關內容

四、其他

1.singularity的一條設計原則,容器內的用戶身份與容器外的用戶身份是一致的。

2.root權限下shell進去,通過pwd可以看到是位于root目錄下;而非root權限下shell進去時,通過pwd可以看到是在當前目錄下。也就是說,不同的shell方法,會有不同的系統默認bind。也可以在shell時,通過-B自定義bind的目錄。通過-B自定義bind時,要求容器內存在相應目錄,但實驗時,明明在container里面已經創建了相應目錄了,shell -B時還是提示沒有在容器內找到相應目錄。是不是bind后,兩個目錄就連通了。

3.關于mount,不理解(點擊查看mount相關內容

4.export部分,也不太理解(點擊查看export相關內容

5.You can even run MPI executables within the container as simply as:

$mpirun -np X singularityexec/path/to/container.img /usr/bin/mpi_program_inside_container(mpi program args)


參考資料

在linux下安裝singularity :http://singularity.lbl.gov/install-linux

quick start :http://singularity.lbl.gov/quickstart

介紹幾個指令的教程 :http://singularity.lbl.gov/singularity-tutorial

用戶指南 :http://singularity.lbl.gov/user-guide

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,795評論 1 21
  • 一、Docker 簡介 Docker 兩個主要部件:Docker: 開源的容器虛擬化平臺Docker Hub: 用...
    R_X閱讀 4,406評論 0 27
  • 三對夫妻,一個單身漢,七位朋友的一場家庭聚會。在餐桌上,有人忽然提出大家一起玩這樣一個游戲,每個人都將手機放到桌面...
    瘋小胖閱讀 346評論 0 0
  • 基業長青是每個創業者都希望看到的,但是正如生老病死生命周期的存在一樣,企業成長也不可避免。 我們的公司還處在成長階...
    張磊沙閱讀 182評論 0 0