如何制作一个工具

本章节篇幅较长,需要您仔细阅读并理解,如果可以,我们建议您在阅读的同时,同步操作,帮助理解。如果遇到问题,可以联系我们flowhub_team@flowhub.com.cn

本地基础镜像/工具镜像的创建

当你在了解docker之后,您将知道,docker镜像的制作可以通过制作dockerfile文件完成,dockerfile的作用主要是告诉docker首先选择什么样的系统作为镜像的系统(如ubuntu16.04),其次需要运行哪些命令安装工具的所需的依赖,然后从哪里拉取工具的代码,完成工具的部署(如github)。如果您不知道dockerfile如何使用,您也可以采用如下方式制作工具镜像:

从远程仓库拉取镜像

具体的命令可以参考什么是docker?中docker工具的使用,不过这里我们将着重介绍一些比较实用的基础镜像。更多工具您可以访问https://registry.hub.docker.com/,生物信息相关的docker您可以访问https://biocontainers.pro/。在系统方面我们建议使用Alpin,最小的Docker镜像只有5MB,提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便。它非常适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像。

操作系统镜像 – 该镜像包含了你想要的操作系统,你可以在此基础上开发

镜像名 获取镜像命令
Ubuntu:16.04 docker pull ubuntu:16.04
Ubuntu:18.04 docker pull ubuntu:18.04
Centos7 docker pull centos:7
Centos8 docker pull centos:8
Alpine (体积最小的linux系统) docker pull alpine
Debian docker pull debian

已安装部分开发环境的镜像 – 该镜像包含了你想要的操作系统以及部分开发环境如R,python环境等

镜像名 获取镜像命令
R最新版本 docker pull r-base:latest
Python最新版本 docker pull python:latest
Perl 最新版本 docker pull perl:latest

已安装部分分析流程软件的镜像 – 该镜像包含了你想要的操作系统以及分析软件等

镜像名 获取镜像命令
Opencue图像渲染管理器 docker pull opencue/rqd
gatk4 生物信息分析流程 docker pull quay.io/biocontainers/gatk4:4.2.0.0--hdfd78af_1

基于已有镜像开发分析工具

如果docker镜像中已经包含了您所需要的软件并且可以成功运行,您可以跳过此步骤。如果您还需要基于已有的镜像进行二次封装,您可以通过两种方式进行。

方式一:使用镜像开启一个容器并运行,进入容器内部,编写和安装分析软件,脚本。测试成功后,退出容器将容器打包成新的镜像,完成工具镜像的制作。部分内容可参考什么是docker

方式二:基于dockerfile完成工具镜像的打包,此方法能够分层管理docker镜像,尽量减小docker镜像的大小,方便传输。

方式三:基于flowhub工具列表中的 Pull Docker 功能进行成熟工具镜像的直接拉取,详情请阅读 工具开发 - 镜像的直接拉取,阅读后可以跳过下方本地工具上传相关说明,直接阅读上传后工具的参数配置

本地工具上传前设置 - 私有云服务

针对私有云服务,公有云可跳过该标题板块。

在上传工具前,需要对docker进行设置,添加信任的仓库服务器地址。具体配置方式如下。

linux系统中,是打开配置文件,如果没有则创建:

vim /etc/docker/daemon.json

打开后,如果是空文件,则添加如下内容,如果存在已有的配置,则找到insecure-registries进行添加

# 添加本地私有云服务IP:5000,如172.10.1.51:5000,需要根据自己的服务进行设置
{
"insecure-registries": [私有云服务IP:5000]
}

保存之后重启docker

service docker restart

windows系统中,运行docker应用程序,点击 setting 再点击 Docker Engine,如下图,然后修改 insecure-registries 对应的内容为本地私有云服务IP:5000,如172.10.1.51:5000,需要根据自己的服务进行设置。

本地工具上传

上传镜像到FlowHub平台,我们以md5sum校验工具的制作为例,进行说明,md5sum为大多数Linux系统的内置工具,所以md5sum的工具镜像非常容易获得,仅需要Linux系统镜像即可,在这里我们使用Alpine镜像即可。由于Alpine镜像内置了md5sum命令,所以我们首先使用docker拉取Alpine镜像。

sudo docker pull alpine:latest
docker images

# REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
# alpine                   latest              28f6e2705743        4 weeks ago         5.61MB

我们可以发现这个镜像惊人的小,只有5.61MB。接下来我们将使用fkit工具上传工具镜像。如果您还没有安装fkit工具或者您还不了解fkit工具的使用,您可以访问Fkit命令行工具介绍。上传成功后,返回FlowHub平台对应项目下,刷新工具列表,您会发现一个新工具md5sum已经添加到列表下了。

# 注释行 使用fkit登录指定项目,fkit login -k [AccessKey] -s [AccessSecret]
# AccessKey AccessSecret 可以在网页右上方的个人头像对应的弹框中获得

./fkit login -k dd3e5b06896711eb8cfb12420bfe23a5 -s ccd4bf88bb0411ebb2227ae21af08499

# login successful
# index:  1 Project id:  aa9e9899985311ebbbf302420bfe23a5     Project Name:  test/demo
# -----------Please select project id--------------
# 选择对应的项目,这里只有一个项目,对应的id为1,所以输入1,按回车
1

# 注释行 登录成功后将本地镜像仓库中的工具镜像推送到对应项目,并且命名工具名称
# fkit createTool [IMAGE_NAME] [TOOL_NAME]
fkit createTool alpine:latest md5sum

# Current project:demo
# {'status': 'The push refers to repository [develop.flowhub.com.cn:5000/81406e14897711ebacec3946668b50ad]'}
# {'status': 'Preparing', 'progressDetail': {}, 'id': 'cb381a32b229'}
# {'status': 'Mounted from 7bbc246c858d11eba9b4fb4dea426e31', 'progressDetail': {}, 'id': 'cb381a32b229'}
# {'status': 'latest: digest: sha256:4661fb57f7890b9145907a1fe2555091d333ff3d28db86c3bb906f6a2be93c87 size: 528'}
# {'progressDetail': {}, 'aux': {'Tag': 'latest', 'Digest': 'sha256:4661fb57f7890b9145907a1fe2555091d333ff3d28db86c3bb906f6a2be93c87', 'Size': 528}}

# push successful

上传后工具的参数配置

我们希望给您提供更加简便的工具配置操作,所以在工具创建时,您只需要上传工具镜像,当工具上传后,您可以通过界面化操作,通过点击工具进入详情页编辑工具内参数信息。点击右侧编辑按钮(current version),开始对工具进行编辑,编辑内容主要包括 工具描述 / 工具命令行 / 工具输入 / 工具输出 / 工具运行的配置等。

工具描述

使用的是markdown编辑器,你可以访问markdown了解具体语法。我们将会提供默认的内容模板,您可以参考这个模板进行内容编辑

工具命令行填写

我们需要编写命令行,使得工具能够根据命令行运行。以md5sum工具为例,在Linux系统中,我们通常运行如下命令即可使用。

md5sum    -t          /input/data.txt     >  /output/md5sum.result.txt
------    ----        ---------------        -----------------------
工具命令   参数          输入文件                输出文件

在FlowHub工具编辑中,我们需要对 输入输出文件 / 文件路径 / 工具参数 进行抓取,设置,所以我们约定了这样的命令行写法,以方便我们更加灵活的工具使用。

类型 命令行书写规则
输入/输出文件 以及 文件路径 #{prefix<:>VALUE<|>io<:>KEY<|>option}
字符串类型参数 #{prefix<:>VALUE<|>string<:>KEY<|>option}
数字类型参数 #{prefix<:>VALUE<|>number<:>KEY<:>VALUE<|>option}

在Flowhub工具编辑中,我们需要对输入文件 / 输出文件 / 工具参数进行抓取,设置,所以我们约定了这样的命令行写法,以方便我们更加灵活的工具使用。

我们使用 #{} 作为抓取的标识符,通过 #{} 抓取我们希望从命令行中暴露出来的 输入文件 / 输出文件 / 工具参数 / 文件路径。

我们使用 prefix<:>VALUE 作为 flag 标识符,没有可不加。

我们使用 string<:>KEY<:>VALUE number<:>KEY<:>VALUE 作为 参数数值 标识符,没有可不加。

我们使用 io<:>KEY 作为 I/O 标识符。

我们使用 option 作为 可选项 标识符,如果前面没有flag 标识符且为必选项目可不加,否则需要带上。

我们使用 <|> 作为分隔符,由于一个抓取符号内存在多个标识符,我们需要用此符号进行分割。

因此上面的工具命令我们可以写成

md5sum   #{prefix<:>-t}    #{io<:>inputkey}   > #{io<:>outputkey} 
------   --------------    -------------------    -----------------------
工具命令  参数                输入文件                输出文件

更详细的说明参考下表

字段 类型 说明
prefix<:>VALUE 前缀标识 prefix是固定不变的,VALUE是前缀的内容,如 -s,-N等, 例如prefix<:>-s , prefix<:>-N ,注意这里是拼接操作,所以前缀和具体内容之间如果是空格连接,需要将空格也包含进VALUE中,如果是=号,需要把=包含进VALUE中, 如prefix<:>-N=
string<:>KEY<:>VALUE
number<:>KEY<:>VALUE
参数标识 string 表示字符类型参数,number表示数字类型参数 KEY对应命令行下方参数列表中的key,需要保证每个参数的唯一性,用户自己编写VALUE对应命令行右侧参数列表中的value,参数的默认值需要与前面的字符串或者数字类型一致
io<:>KEY I/O标识 TYPE有两个可选值input 表示输入,output表示输出 input,output标签中的KEY参数标识唯一性,所有的KEY都不能重复
option 可选项 抓取标识符内出现option表示为可选项,抓取标识符内出现require表示为必选项

由于完整的书写整个抓取模式较为复杂,我们也约定了一些简写方式:

  1. 参数仅仅是一个前缀标识符,后面不跟数值或者其他内容。例如md5sum中的-t参数表示读取文本文件,后面无需带上参数,则可以表示为#{prefix<:>-t}, 如果是可选项,则可以表示为#{prefix<:>-t<|>option}

  2. 参数没有前缀标识符,仅仅是需要填写数值或者字符,则可以表示为#{string<:>KEY<:>VALUE} #{number<:>KEY<:>VALUE}

  3. 输入输出没有前缀标识符,#{io<:>KEY}

  4. option如果是必选项的话,可以省略该部分

input / output设置

写完命令行后,参数列表将根据命令行自动生成,但我们还需要在input和output中配置对应的文件。

先介绍input列表如何填写:

字段 说明
dirName 与命令行中io参数的KEY相对应,表示文件将会放入到容器内输入文件夹的位置。 如果in cmd是勾选状态,命令行中放入该文件的绝对文件路径。 如果in cmd是不勾选状态,命令行中放入该文件的绝对目录路径,不包含文件名。
port 工具在流程图中暴露出来的端口名,具体可以查看流程创建
port type 有三个可选项,item,array和dir。item表示输入类型是单个文件, array表示输入类型是多个文件,若in cmd是勾选状态,则将绝对文件路径都拼入且用空格隔开。 dir表示输入的是一个文件夹。
pattern * 接受任何格式的文件输入 *.XXX 接受以XXX结尾的文件,如*.jpg ,*.png, *.txt, *.fasta
IO path type 包含 filePath 和 dirPath 两种选择。
filePath: 包含文件名的完整路径
dirPath: 输入文件所在目录的路径

再介绍output如何填写:

字段 说明
dirName 与命令行中io参数相对应,表示文件将会放入到容器内输出文件夹的位置。 如果in cmd是勾选状态,命令行中放入该文件的绝对文件路径。 如果in cmd是不勾选状态,命令行中放入该文件的绝对目录路径,不包含文件名。
path 子目录路径,可以为空,如果dirName对应的路径下还有子文件夹,则可以在此处填写dirName位置下方的子目录,如 result/data/
port 工具在流程图中暴露出来的端口名,具体可以查看流程创建
port type 有三个可选项,item,array和dir。item表示输出类型是单个文件, array表示输出类型是多个文件,若in cmd是勾选状态,则将绝对文件路径都拼入且用空格隔开。 dir表示接受一个文件夹作为输出,此时in cmd不可勾选,表示只会在命令行中拼入路径
pattern * 接受任何格式的文件输入 *.XXX 接受以XXX结尾的文件,如*.jpg ,*.png, *.txt, *.fasta 如果 port type选择的是item 且in cmd为勾选状态,则此处必须是具体的文件名 port type选择的是 array 且in cmd为勾选状态这种组合将不会被系统支持。port type为dir状态时,该选项会被禁用
IO path type 包含 filePath 和 dirPath 两种选择。
filePath: 包含文件名的完整路径
dirPath: 输出文件所在目录的路径

我们回到md5sum工具,当工具编辑页的命令行为如下命令时,对应的 input列表 和 output列表 我们将会按下图的方式填写,以达到构建工具的目的。

md5sum  #{prefix<:>-t} #{io<:>inputkey} > #{io<:>outputkey}

命令行预览

在工具配置页面,我们提供了命令配置板块,并且内置了一些命令行配置的快捷按钮,如插入字符串参数,数字参数或者IO参数等。同时为了方便用户快速了解真实命令行情况,我们也同步展示了对应实际允许的命令参数信息。

机型选择

选择工具运行时默认开启的机器类型,这里是作为开发者对工具性能的估计,选择最优机型,如果工具的内存开销,CPU开销是根据文件大小决定的,则在投递任务时根据实际情况再做修改,由于md5sum比较简单,我们这里选择最小配置即可。如果您的工具需要GPU,也可以申请GPU配置机器运行。

机器网络设置

由于FlowHub平台在任务投递计算过程中,为了保护用户数据安全,默认是不会让计算任务的机器连接网络的,如果您的工具存在联网获取数据的需求,您需要在项目Setting页面,找到Network选项,选择开启联网协议,开启后,您可以在工具编辑页面看见网络设置的板块,您可以根据工具需要选择是否开启网络。

当编辑完工具时,点击右上方Update按钮,完成对工具配置的保存。这样一个工具就做好了。期待您的使用,如在操作过程有其他疑问,请联系我们或留言箱留言flowhub_team@flowhub.com.cn,我们会第一时间给予帮助和反馈。

results matching ""

    No results matching ""