Build容器

Singulartiy使用 build 命令build容器. 使用build命令可以从 Container LibraryDocker Hub 下载已有容器。 build命令也支持使用 Singularity definition 文件从头开始build一个定制化的容器。 build命令还支持不同容器格式之间的转化。

概述

build 命令支持从不同的源来创建一个容器。

下面是 build 命令支持的不同的源:

  • URI如果以 library:// 开头,那么将从Container Library下载容器

  • URI如果以 docker:// 开头, 那么将从Docker Hub下载容器

  • URI如果以 shub:// 开头,那么将从Singularity Hub下载容器

  • 基于本机已经存在的一个容器build容器

  • 基于本机sandbox build容器

  • 使用 Singularity definition file 文件build容器

build 命令产生的容器有两种格式。

  • Singularity Image File (SIF) 格式,只读,容器是压缩的,适用于生产环境,这也是默认的格式。

  • sandbox (ch)root directory 格式,支持读写,这适用于交互式的开发使用,使用 --sandbox 生成这种格式的容器

build 命令可以支持这两种格式之间的转换。

从Container Library下载容器

你可以使用build命令从Container Library下载容器。

$ sudo singularity build lolcow.simg library://sylabs-jms/testing/lolcow

第一个参数 lolcow.simg 指定生成的容器的名字和路径, 第二个参数 library://sylabs-jms/testing/lolcow 指定从Container Library容器的URI。 默认情况下,生成的容器是只读的SIF格式,如果要生成可写的容器,需要加上 --sandbox 的选项。

从Docker Hub下载容器

你可以使用build命令从Docker Hub下载容器,这个命令实际上是下载docker容器并转为singularity容器.

$ sudo singularity build lolcow.sif docker://godlovedc/lolcow

创建可写的 --sandbox 目录

如果你需要创建一个可写的目录(这里叫做sandbox),你需要使用 --sandbox 选项。非root用户也可以创建sandbox,但是有些文件权限会有问题,建议使用root用户创建sandbox。

$ sudo singularity build --sandbox lolcow/ library://sylabs-jms/testing/lolcow

Singularity对sandbox目录的操作使用和对SIF的操作使用是一样的。如果需要修改sandbox容器,那么在操作的时候需要使用 --writable 选项。

$ sudo singularity shell --writable lolcow/

容器格式的转换

如果您本地已经有一个容器,你想基于这个容器来创建一个新的容器。这个命令允许你从一种格式转到另外一种格式。 比如你有一个sandbox叫做 development/ 你想把它转成SIF格式的 production.sif:

$ sudo singularity build production.sif development/

需要注意的是,当你把sandbox的格式转成SIF格式的时候。 你在sandbox里面所做的修改并没有记录在定义到Singularity definition文件里面, 因此最好还是使用Singularity definition文件来创建容器,这样容器是可以重复build和创建的。

使用Singularity definition文件build容器

当然也可以使用Singularity definition文件去创建容器容器。关于怎么写Singularity definition文件,可以参考 Container Definition。让我们假定你已经有一个definition文件叫做 lolcow.def,你想用它创建一个SIF的容器。

Bootstrap: docker
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

使用下面命令创建容器。

$ sudo singularity build lolcow.sif lolcow.def

Note

需要注意的是,你在一个节点上创建的容器在另外一个节点上可能不工作。这可能是因为默认的压缩程序不同。 比如,创建容器的节点,它默认的压缩程序是 xz ,而CentOS 6上的压缩程序只有 gzip ,所以容器不能在CentOS 6上运行。

build加密容器

Singularity从3.4.0开始支持build加密容器。使用加密容器时,加密容器被解密到内核空间,因此,不会有任何解密的数据留在硬盘或者内存当中。 更多加密容器信息,请参考 encrypted containers

Build命令选项

--builder

Singularity 3.0 开始支持远程build容器。这个选项允许你指定一个不同的build服务。这个选项必须和 --remote 一起使用。

--detached

这个选项和 --remote 一起使用, 这个选项将不再当前的terminal中输出远程的build服务的输出。

--encrypt

这个选项用来创建加密容器。创建加密容器时从环境变量 SINGULARITY_ENCRYPTION_PASSPHRASE 或者 SINGULARITY_ENCRYPTION_PEM_PATH 中获取加密口令来加密容器 encrypted containers

--fakeroot

这个选项允许以非特权模式build容器 the fakeroot feature

--force

这个选项强制删除和覆盖一个已经存在的容器,并且不会有交互性的提示。

--json

使用这个这个选项,Singularity会解析一个json格式的definition文件。

--library

这个选项允许你指定一个不同的library(默认的library是https://library.sylabs.io)。

--notest

如果你build容器的时候不想运行definition文件中test这一段,你可以使用这个参数跳过。 比如当你build一个GPU容器,在生产环境中有GPU,test这一段能正常运行,但是build容器的机子上没有GPU,因此可以使用这个选项来在build容器的时候不运行 test。

--passphrase

这个标记允许你传一个口令来加密容器 encrypted containers

--pem-path

这个标记允许你传一个公钥的文件的位置来加密容器 encrypted containers

--remote

Singularity 3.0 开始支持在安装有build服务的远程资源上build容器(默认的远程资源是https://cloud.sylabs.io/builder)。

--sandbox

build一个sandbox (chroot directory)的容器,而不是默认的SIF容器。

--section

build容器的时候只运行definition文件中的一些段落。这个想象支持以逗号分割的多个段落。 可用的参数包括 all, none 或者和面这些段落的任意组合:setup, post, files, environment, test, labels

正常的build容器过程中,definition文件被保存到了容器的meta-data中,使用 --section build出的容器,由于运行了部分的段落, 其meta-data和容器实际上是不一致的,因此慎用。

--update

这个选项,你可以多次创建sandbox容器 (多次创建的结果不可预测,通常不建议多次创建)。

默认情况下,当你创建一个sandbox容器的时候,会提示你是否要覆盖已经存在的容器。当使用 --update 时,如果有已经存在的容器不会提示, Singularity会跳过definition文件中的header部分,将其他部分覆盖到已经存在的容器。

这个命令只在创建sandbox的时候才能用。

关于容器的其它主题