Singularity(三)| 将docker转化为singularity容器
Singularity 容器格式
Singularity 容器存在两种不同的格式(或者称为状态):
- 适用于生产的压缩的 **只读 singularity 镜像文件(Singularity Image File,SIF)**格式
- 用于交互式开发的 可写根目录,称为沙盒(sandbox) (以
--sandbox
选项生成)
sif 格式确保了镜像的可再现性和可验证性。然而,在测试和调试期间,我们一般会需要一个可改写的沙箱(sandbox)格式(实际上就是一个目录)。
构建 Singularity 容器的主要方式是通过 build
指令从外部资源(如 Container Library 和 Docker Hub)下载或在本地组装现有的容器。
build
指令接受一个以下目标(分别对应不同的需求、来源和应用场景)作为输入,产生一个容器作为输出:
-
来源于容器库(Container Library)以
library://
开头的 URL 链接singularity build --sandbox lolcow/ library://sylabs-jms/testing/lolcow
-
来源于 Docker Hub 以
docker://
开头的 URL 链接singularity build lolcow docker://godlovedc/lolcow
-
来源于 Singularity Hub 以
shub://
开头的 URL 链接singularity build mycontainer.sif shub://singularityhub/ubuntu
-
本地现存的容器路径
-
沙盒(sandbox)目录路径
-
Singularity 容器定义文件
我们也可以使用 pull
指令从以上三种公共容器仓库中直接下载容器到本地,下载的容器默认以 sif 镜像的形式存在,例如:
singularity pull library://sylabsed/linux/alpine
singularity pull docker://godlovedc/lolcow
**Singularity 可以与 Docker 镜像一起使用。**之所以包含这个特性,是因为开发人员非常喜欢使用 Docker,且已经投入了大量资源来创建 Docker 镜像。因此,Singularity 早期的开发目标之一就是支持 Docker,其满足以下条件:
- 不需要安装 Docker
- 可以 shell 进入一个 Singularity 化的 Docker 镜像
- 可以立即将 Docker 镜像作为 Singularity 镜像运行
- 可以直接 pull 一个 Docker 镜像(不需要
sudo
) - 可以使用装配好的 Docker 层(包括环境、内核和标签)构建镜像
将 Docker 镜像转化为 Singularity 镜像的方式主要有以下两种:
3.1 使用本地现有的 Docker 镜像
-
查找 Docker 镜像 ID
在运行 Docker 的主机上,使用命令
docker images
查找存储在本地注册表中的 Docker 镜像的镜像 ID (通常是 /var/lib/docker):$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/biocontainers/samtools 1.17--hd87286a_1 c6ab05d10f7f 6 weeks ago 66.7MB hello-world latest 9c7a54a9a43c 2 months ago 13.3kB
-
创建 Docker 镜像的 tarball 文件
对于想移植到其它主机上的 Docker 镜像,例如,biobakery/lefse,镜像ID为 c6ab05d10f7f,使用
docker save
命令创建一个 tarball:docker save c6ab05d10f7f -o samtools.tar
-
把 tarball 拷贝到运行容器的 Linux 主机上
使用
scp
拷贝,例如:scp -P 22 -r samtools.tar user@111.1.111.11:/home/user
-
将 tarball 转换为 Singularity 镜像
如果 tarball 在当前工作目录中,执行:
singularity build --sandbox samtools docker-archive://samtools.tar
如果 tarball 文件不在当前工作目录中,需指定路径,例如 /tmp:
singularity build --sandbox samtools docker-archive:///tmp/samtools.tar
注意:在该例中,samtools 是 Singularity 镜像的目录名。
-
运行 Singularity 沙箱镜像,例如:
singularity shell samtools singularity exec samtools samtools help singularity run samtools
3.2 使用 Docker 容器仓库中收录的镜像
如果准备使用的 Docker 镜像已经上传到 Docker Hub (https://hub.docker.com/) 或 Quay (https://quay.io/) 等 Docker 托管存储库中,我们可以直接下载并将其转化为 Docker 容器。例如,镜像 godlovedc/lolcow 存在于 Docker Hub 中,samtools 镜像存储在 Quay 中:
singularity build samtools.sif docker://quay.io/biocontainers/samtools:1.17--hd87286a_1
singularity build --sandbox lolcow docker://godlovedc/lolcow
3.3 使用 Dockerfiles
从 4.1 版本开始,SingularityCE 可以直接从 Dockerfiles(与后面介绍的singulariyt Definition File 类似)中构建 OCI-SIF 映像,创建可以使用 SingularityCE 的 OCI 模式(Open Container Initiative(OCI)是一个为规范容器格式和运行时环境创建的开放行业标准)运行的映像。
$ cat ./Dockerfile
FROM debian
CMD cat /etc/os-release
$ singularity build --oci ./debian.oci.sif ./Dockerfile
$ singularity run --oci ./debian.oci.sif
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
当然,我们也可以先通过 Dockerfiles 构建 docker 容器,再将 docker 容器转换为 singularity。
本文由mdnice多平台发布