Singularity:构建容器镜像

构建一个容器

可以使用 build 命令从容器库和 Docker Hub 等外部资源下载和组装现有容器。 也可以使用build命令在Singularity支持的格式之间转换容器。可以将build与Singularity定义文件结合使用,从头开始创建一个容器,并根据你的需求对其进行定制。

概述

build 命令接受一个目标参数作为输入,并生成一个容器。这个目标定义了 build 创建容器的方法。可以是下面的任意一类:

  • 以库开头的 URI://,从容器库构建
  • URI 以 docker://开头,从 Docker Hub 构建
  • URI 以 shub://开头,从Singularity Hub构建
  • 本地计算机上现有容器的路径
  • 要从沙箱构建的目录的路径
  • Singularity定义文件的路径

build可以生成两种不同格式的容器,具体如下。

  • 适用于生产环境使用的压缩只读 Singularity Image File (SIF) 格式 (默认)
  • 适用于交互式开发的根目录可写的沙盒 (–sandbox)

由于build可以接受现有容器作为目标,并以任何一种支持的格式创建容器,因此可以将现有容器从一种格式转换为另一种格式。

从容器库下载现有容器

使用 build 命令从容器库下载容器。

singularity build lolcow.simg shub://GodloveD/lolcow
  • 第一个参数 (lolcow.simg) 指定容器的路径和名称。
  • 第二个参数 (shub://GodloveD/lolcow) 给出了从中下载的容器库 URI。

默认情况下,容器将转换为压缩的只读 SIF。如果希望容器采用可写格式,请使用 –sandbox 选项。

从 Docker Hub 下载现有容器

您可以使用 build 从 Docker Hub 下载并将其组装到singularity容器中。

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

创建可写的 --sandbox 目录

如果想在可写目录 (称为沙箱) 中创建一个容器,可以使用 –sandbox 选项。并且可以创建没有 root 权限的沙箱。

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

生成的目录可以像 SIF 文件中的容器一样运行。如果要对容器中进行更改,调用容器时需要加上 –writable 参数。

singularity shell --writable lolcow/

将容器从一种格式转换为另一种格式

可以将本地保存的容器用作构建新容器的目标,这可以实现将容器从一种格式转换为另一种格式。 例如,如果有一个名为 development/ 的 sandbox 容器,可以用以下命令转换为名为 production.SIF 的 sif 容器:

singularity build production.sif development/

将 sandbox 容器目录转换为 SIF 格式时,如果在转换之前对可写 sandbox 容器进行了更改,而 singularity 定义文件中没有这些更改的记录,转换后的容器不会保留之前的更改。最好直接从 singularity 定义文件构建不可变的 SIF 生产容器。

从 singularity 定义文件构建容器

有关编写 singularity 定义文件的详细信息,请参见容器定义文档。

singularity定义文件可以作为目标构建容器。假设有以下名为 lolcow.def 的容器定义文件:

Bootstrap: docker
From: ubuntu:16.04
%post
    apt-get -y update