内容预览
- 什么是软件容器(有什么好处?)
- 什么是Singularity?
- 构建Singularity容器
- 容器构建流程图
什么是软件容器(有什么好处?)
关于容器技术,在以往的文章中已介绍过一次。 本文重点介绍Singularity的必需技术,以及如何构建一个属于自己的容器,在全文最后,附上一张构建容器的流程图供大家参考。
首先以实际应用例子来说,借助于容器技术我们可以实现哪些操作?
-
打包分析管道,使其在您的笔记本电脑、云端和高性能计算 (HPC) 环境中运行,以产生相同的结果。
-
发表论文并包含指向包含您使用的所有数据和软件的容器的链接,以便其他人可以轻松重现您的结果。
-
通过几次击键即可安装并运行需要复杂依赖关系堆栈的应用程序。
-
创建管道或复杂的工作流程,其中每个单独的程序都应在不同的操作系统上运行。
👉 想必很多同学遇到过这样的场景
在本地电脑上调试好的分析软件,即使是同样的安装手册,在实验室/超算中心的电脑上,死活装不上,遇到各种奇怪的报错,例如make失败、cpp预处理器版本不支持、安装perl软件的cpan包依赖安装失败等等。
因此,对于刚开始接触信息分析的小伙伴来说,掌握这门技术,对于实现分析稳定复现、在高性能服务器上快速配置分析管道等都有非常重要的作用
什么是Singularity?
Singularity与Docker一样,都是容器技术的一种。
尽管,Singularity确实存在一些不可忽视的弱点,例如比Docker更不成熟以及更小的社区用户。
其真正的优势在于高性能服务器上部署分析管道时,无需root权限、安全性以及低成本的入门学习,并且能无缝地将Docker容器转换为singularity容器。
而Docker无论是容器构建、运行、生成的结果文件,都需要root权限,这对于用户使用来说非常不方便。
Singularity的快速安装
首先,我们需要确保一些必需的包已经得到安装
在Ubuntu中(根据linux系统选择)
arduino
$ sudo apt-get update
$ sudo apt-get install -y build-essential libssl-dev uuid-dev libgpgme11-dev \
squashfs-tools libseccomp-dev wget pkg-config git cryptsetup debootstrap
在Centos中(根据linux系统选择)
ruby
$ sudo yum -y update
$ sudo yum -y groupinstall 'Development Tools'
$ sudo yum -y install wget epel-release
$ sudo yum -y install debootstrap.noarch squashfs-tools openssl-devel \
libuuid-devel gpgme-devel libseccomp-devel cryptsetup-luks
接着,singularity使用Golang编写,因此需要安装Go语言
shell
$ wget https://dl.google.com/go/go1.13.linux-amd64.tar.gz
$ sudo tar --directory=/usr/local -xzvf go1.13.linux-amd64.tar.gz
# 此处将Go添加到临时环境中,如果需要开机自启,请修改~/.bashrc文件
$ export PATH=/usr/local/go/bin:$PATH
# 解压
$ wget https://github.com/singularityware/singularity/releases/download/v3.5.3/singularity-3.5.3.tar.gz
$ tar -xzvf singularity-3.5.3.tar.gz
之后,构建安装singularity
shell
$ cd singularity
$ ./mconfig
$ cd builddir
$ make
$ sudo make install
如果希望singularity支持tab补全
shell
$ . etc/bash_completion.d/singularity
$ sudo cp etc/bash_completion.d/singularity /etc/bash_completion.d/
最后,测试安装
markdown
$ singularity run library://godlovedc/funny/lolcow
# 如果安装正常,则会出现以下内容:
INFO: Downloading library image
_______________________________________
/ Excellent day for putting Slinkies on \
\ an escalator. /
---------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Singularity容器下载
在线的容器库:
-
The Singularity Container Library, 由 Sylabs 开发和维护
-
Docker Hub, 由 Docker 开发和维护
-
Quay.io, 由红帽开发和维护
-
NGC, 由 NVIDIA 开发和维护
-
BioContainers, 由 Bioconda 集团开发和维护
-
Amazon AWS、Microsoft Azure 和 Google Cloud 等云提供商也拥有可与 Singularity 配合使用的容器注册表
类似于docker,singularity也能从网络上使用pull命令来下载容器
shell
# 从singularity库下载容器
$ singularity pull library://godlovedc/funny/lolcow
# 下载完成后,将会看见一个sif结尾的文件,这个就是singularity的容器文件
lolcow_latest.sif
# 也可以从docker库下载容器
$ singularity pull docker://godlovedc/lolcow
Singularity容器使用
进入容器:shell
命令
ruby
$ singularity shell lolcow_latest.sif
退出容器:exit
命令
shell
# 在容器环境中
Singularity> exit
# 就会返回到真实环境下
~>
在容器内执行任务:exec
命令
markdown
$ singularity exec lolcow_latest.sif cowsay 'How did you get out of the container?'
_______________________________________
< How did you get out of the container? >
---------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
运行容器:run
命令
shell
$ singularity run lolcow_latest.sif
# 此处的run,实际上是调用容器内的一个runscript的特殊文件
# 检查容器内的runscript文件
$ singularity inspect --runscript lolcow_latest.sif
#!/bin/sh
fortune | cowsay | lolcat
# 此外,也可以像运行软件一样来使用容器,例如
./lolcow_latest.sif
构建Singularity容器
要构建一个容器,必须使用build
命令
一个标准的容器开发周期为:
-
编写一个可写的容器(sandbox)
-
使用--writeable进入容器,以交互方式对容器进行修改
-
对文件进行修改
-
重新build
-
重复前两步,直到容器变成我们期望的状态
-
build并保存容器,以供生产使用
例如我们手头已经有一个现成的recipes(用于build的命令文件)
vbnet
BootStrap: debootstrap
OSVersion: stable
MirrorURL: http://ftp.us.debian.org/debian/
%runscript
echo "This is what happens when you run the container..."
%post
echo "Hello from inside the container"
apt-get -y --allow-unauthenticated install vim
在这个文件中,%开头的通常表示在构建过程中起着一定特殊作用,具体可以参考文档:docs.sylabs.io/guides/3.5/...
常用的符号有:
%post(执行命令,如下载、安装、编写配置文件、创建目录等)
%files(将文件复制到容器中)
%test(构建完成后,测试容器)
%environment(设置环境变量,类似于修改.bashrc)
%runscript(比较特殊,在呼出容器时,可以自动执行计划的任务)
从头构建一个容器
对于新手而言,通常在build容器时,需要给出--sandbox选项,这在我们还不知道容器开发具体需要包含什么文件的时候,非常有用
开始build容器
css
$ sudo singularity build --sandbox lolcow lolcow.def
运行完成后,会在当前目录下看到一个lolcow文件
对容器进行探索和修改
sql
$ sudo singularity shell --writable lolcow
Singularity> apt-get update
Singularity> apt-get install -y fortune cowsay lolcat
此时可以看到应用程序成功安装,但如果没有使用--writeable参数,那么在进入容器后,执行安装命令,通常会被告知这些文件都是read-only,不可修改
需要说明的是,与docker类似,在容器中进行的操作,在退出容器后,这些修改并不会保存,如果要使这些修改永久生效,就需要将这些操作加入到定义文件中,重新build
从现有容器构建
从现有容器构建,需要注意的是,要修改build定义文件的header
例如需要以容器库中现有的容器作为起点
makefile
# 例如以debian为起点
BootStrap: library
From: debian
# 或者从docker hub上的debian启动
Bootstrap: docker
From: debian
# 再或者以本地文件系统上的基础容器启动
Bootstrap: localimage
From: /home/test/debian.sif
与从头构建容器相比,从现有容器构建的最大好处是不需要root权限
ruby
$ singularity build debian3.sif debian2.sif
安全的构建容器
在singularity中,提供了--fakeroot选项,可以以更安全的方式在容器中使用root权限来build容器
css
$ singularity build --fakeroot container.sif container.def
容器挂载主机文件
默认情况下,容器运行后会自动绑定主机的几个目录,包括:
bash
$HOME
/tmp
/proc
/sys
/dev
此外,也可以使用--bind/-B/SINGULARITY_BINDPATH来指定需要绑定的其他目录
至此,你已经掌握了构建一个singularity容器的必须技能了,可以去尝试构建一个属于自己的容器。
容器构建流程图
本文由博客一文多发平台 OpenWrite 发布!