如何从 Singularity 镜像构建 Docker 镜像

5

我目前正在使用Singularity和Docker进行工作。我正在为MPI环境运行Singularity。

我希望利用Singularity的优势来进行MPI,但是Singularity文件非常大。因此,在运行Singularity镜像后,我想将其转换为Docker镜像,然后保存它,这将节省磁盘空间。

是否可以将Singularity镜像转换为Docker镜像?

3个回答

4

正如@tsnowlan在他们的回答中所说,通常的工作流程是从Docker到Singularity。但是有一种方法可以从现有的Singularity镜像创建Docker镜像。这不会利用Docker的层缓存功能。

一般的想法是:

  1. 将Singularity镜像文件系统转储为squashfs文件。
  2. 将squashfs文件提取到目录中。
  3. 创建一个继承自scratch的Dockerfile,复制Singularity镜像的文件系统,并设置环境变量和其他内容。
  4. 构建Docker镜像。

这是在alpine:latest上演示的bash代码:

singularity pull docker://alpine:latest
# Find out which SIF ID to use (look for Squashfs)
singularity sif list alpine_latest.sif
# Get the environment variables defined in the Singularity image.
singularity sif dump 2 alpine_latest.sif
singularity sif dump 3 alpine_latest.sif > data.squash
unsquashfs -dest data data.squash
# See the Dockerfile definition below
docker build --tag alpine:latest .

Dockerfile的内容:
FROM scratch
COPY data /
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
CMD ["/bin/ash"]

关于 Singularity 和 Docker 的更多信息,我建议查看 Singularity 在该主题上的文档

0

一般来说,是反过来做的:基于Docker构建一个Singularity镜像。如果您计划将其存储为Docker镜像而不是Singularity,则最好将其构建为Docker并根据需要转换为Singularity。我知道有几个实验室使用这种方法:通过Dockerfile构建,将其推送到Docker Hub进行存储,然后直接从Docker Hub镜像构建Singularity镜像。

但是,Singularity镜像通常比Docker镜像小。在其他答案中提到的基本Docker镜像tacc/tacc-ubuntu18-mvapich2.3-psm2:0.0.2大小为497MB,而Singularity镜像仅为160MB。ubuntu:latest大小为64.2MB vs 25MB,python:latest大小为933MB vs 303MB。


Singularity镜像通常不会更小。您引用的Docker镜像大小是未压缩的大小。例如,ubuntu:latest的压缩大小为25.9 MB,而Python则为341.02 MB。 - jkr
很高兴看到Docker可以将镜像压缩得更小。虽然这使它们的大小大致相当,但在所有这些情况下,Singularity仍然稍微更小一些。 - tsnowlan
是的,Docker 使用 gzip 压缩,而 squashfs 默认使用 gzip 压缩。Singularity 在内部使用 squashfs。 - jkr

0

使用Singularity将MPI应用程序容器化并不是非常困难,但这需要主机系统具备额外的要求。

这意味着你必须为自定义镜像选择正确的基础镜像。 例如:这个例子

FROM tacc/tacc-ubuntu18-mvapich2.3-psm2:0.0.2

RUN apt-get update && apt-get upgrade -y && apt-get install -y python3-pip
RUN pip3 install mpi4py

COPY pi-mpi.py /code/pi-mpi.py
RUN chmod +x /code/pi-mpi.py

ENV PATH "/code:$PATH"

将MPI应用程序容器化为Singularity不是我的问题。我以前做过这个。我只想将Singularity镜像转换为Docker镜像。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接