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