Docker转Singularity

Docker镜像转换为Singularity的sif格式镜像文件

需求

本地搭建了一些docker镜像,已有的方案用Cromwell投递WDL项目时用的是Singularity镜像,所以需要转为Singularity的sif格式镜像文件。

错误方案

同事之前已经写了一个将docker hub的镜像pull下来并转为sif格式的脚本,想改成用singularity build去处理本地docker镜像。
但是发现生成的sif文件名称没有sha256后面的验证码。
正常生成的sif名称类似:***_varscan2_sha256_b235818***************595db587df.sif,但是singularity build生成的的会类似***varscan2_sha256.sif。
原因是sha256验证码取的是docker镜像的RepoDigests,此信息只有当镜像被上传到docker hub后才会有。
本地搭建的,未上传到docker hub的镜像,使用docker images –digests查看会见到该镜像的DIGEST列的值为<none>。所以其实是sha256码本身就不存在,所以无法生成对应的文件名。
其实没有sha256的Singularity的sif格式镜像文件也可以用于Cromwell投递WDL项目,需要Cromwell配置文件设置参数。[这里挖一个坑,写好填上]

已有的用于Docker转换为Singularity的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash

docker=$1

export SINGULARITY_CACHEDIR=[存放Singularity镜像的目录]
CACHE_DIR=$SINGULARITY_CACHEDIR
DOCKER_NAME=$(echo $docker | cut -d":" -f 1 | sed -e 's/\//_/')
SHA_NAME=$(docker inspect --format='{{index .RepoDigests 0}}' ${docker} | cut -d":" -f 2)
SHA_TAG="sha256_${SHA_NAME}"
IMAGE=$CACHE_DIR/${DOCKER_NAME}_${SHA_TAG}.sif
if [ ! -f $IMAGE ]; then
singularity pull $IMAGE docker://${docker}
fi

正确方案

先将本地的docker image上传到docker hub上(参考),生成Docker镜像的RepoDigests后,再跑一下上面的shell脚本。

  1. 注册docker hub账户,https://hub.docker.com/
  2. 在服务器上登录docker hub,命令行docker login,输账号密码。
  3. 检查镜像的REPOSITORY命名方式,必须是“注册用户名/镜像名”。不符合的可以用docker tag 修改。修改后可以docker rmi 把旧的删掉。
  4. 上传镜像到docker hub,命令行docker push REPOSITORY:TAG,等待上传完毕即可。无需重新pull镜像,上传完本地的镜像就会有RepoDigests,可以通过docker images –digests查看。
  5. 退出当前docker hub账号,命令行docker logout。
  6. 使用上面的shell脚本将docker容器转为sif格式,传入参数是docker image的REPOSITORY:TAG。