Singularity(三)| 将docker转化为singularity容器

2024-03-12 23:12

本文主要是介绍Singularity(三)| 将docker转化为singularity容器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Singularity(三)| 将docker转化为singularity容器

Singularity 容器格式

Singularity 容器存在两种不同的格式(或者称为状态):

  • 适用于生产的压缩的 只读 singularity 镜像文件(Singularity Image File,SIF)格式
  • 用于交互式开发的 可写根目录,称为沙盒(sandbox)(以 --sandbox 选项生成)

sif 格式确保了镜像的可再现性和可验证性。然而,在测试和调试期间,我们一般会需要一个可改写的沙箱(sandbox)格式(实际上就是一个目录)。

构建 Singularity 容器的主要方式是通过 build 指令从外部资源(如 Container Library 和 Docker Hub)下载或在本地组装现有的容器。

build 指令接受一个以下目标(分别对应不同的需求、来源和应用场景)作为输入,产生一个容器作为输出:

  1. 来源于容器库(Container Library)以 library:// 开头的 URL 链接

    singularity build --sandbox lolcow/ library://sylabs-jms/testing/lolcow
  2. 来源于 Docker Hub 以 docker:// 开头的 URL 链接

    singularity build lolcow docker://godlovedc/lolcow
  3. 来源于 Singularity Hub 以 shub:// 开头的 URL 链接

    singularity build mycontainer.sif shub://singularityhub/ubuntu
  4. 本地现存的容器路径

  5. 沙盒(sandbox)目录路径

  6. 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 镜像

  1. 查找 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
  2. 创建 Docker 镜像的 tarball 文件

    对于想移植到其它主机上的 Docker 镜像,例如,biobakery/lefse,镜像ID为 c6ab05d10f7f,使用 docker save 命令创建一个 tarball:

    docker save c6ab05d10f7f -o samtools.tar
  3. 把 tarball 拷贝到运行容器的 Linux 主机上

    使用 scp 拷贝,例如:

    scp -P 22 -r samtools.tar user@111.1.111.11:/home/user
  4. 将 tarball 转换为 Singularity 镜像

    如果 tarball 在当前工作目录中,执行:

    singularity build --sandbox samtools docker-archive://samtools.tar

    如果 tarball 文件不在当前工作目录中,需指定路径,例如 /tmp:

    singularity build --sandbox samtools docker-archive:///tmp/samtools.tar

    注意:在该例中,samtools 是 Singularity 镜像的目录名。

  5. 运行 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 多平台发布

这篇关于Singularity(三)| 将docker转化为singularity容器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802887

相关文章

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D