工具篇|一文入门Singularity

内容预览

  • 什么是软件容器(有什么好处?)
  • 什么是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命令

一个标准的容器开发周期为:

  1. 编写一个可写的容器(sandbox)

  2. 使用--writeable进入容器,以交互方式对容器进行修改

  3. 对文件进行修改

  4. 重新build

  5. 重复前两步,直到容器变成我们期望的状态

  6. 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 发布!

相关推荐
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
人工智能·python·机器学习·数据挖掘
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-2.技术栈
人工智能·python·机器学习·数据挖掘
景鹤4 小时前
【算法】递归+回溯+剪枝:78.子集
算法·机器学习·剪枝
光明中黑暗6 小时前
机器学习 笔记
人工智能·笔记·机器学习
yxzgjx6 小时前
水滴式粉碎机在稻壳粉碎与饲料加工中的应用
机器学习
阑梦清川6 小时前
数学建模---利用Matlab快速实现机器学习(上)
机器学习·数学建模·matlab·预测算法
pzx_0016 小时前
【Pytorch】model.eval()与model.train()
人工智能·pytorch·机器学习
IT古董8 小时前
【机器学习】平均绝对误差(MAE:Mean Absolute Error)
人工智能·python·机器学习
编码小袁8 小时前
深入探究R语言中的机器学习应用——从基础到实战
开发语言·机器学习·r语言
奔跑的小狗9 小时前
torch.nn.**和torch.nn.functional.**的区别
pytorch·深度学习·机器学习