如何制作一个工具
本章节篇幅较长,需要您仔细阅读并理解,如果可以,我们建议您在阅读的同时,同步操作,帮助理解。如果遇到问题,可以联系我们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表示为必选项 |
由于完整的书写整个抓取模式较为复杂,我们也约定了一些简写方式:
参数仅仅是一个前缀标识符,后面不跟数值或者其他内容。例如md5sum中的-t参数表示读取文本文件,后面无需带上参数,则可以表示为#{prefix<:>-t}, 如果是可选项,则可以表示为#{prefix<:>-t<|>option}
参数没有前缀标识符,仅仅是需要填写数值或者字符,则可以表示为#{string<:>KEY<:>VALUE} #{number<:>KEY<:>VALUE}
输入输出没有前缀标识符,#{io<:>KEY}
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,我们会第一时间给予帮助和反馈。