CWL の requirements 一巡り: DockerRequirement

3 min read読了の目安(約3100字

この記事は CWL Advent Calendar 2020 の10日目の記事です。

Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]

今回は CWL v1.2 で定義されている DockerRequirement について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。

対象読者

Conformance test #7: tests/cat3-tool.cwl:

#!/usr/bin/env cwl-runner
class: CommandLineTool
cwlVersion: v1.2
doc: "Print the contents of a file to stdout using 'cat' running in a docker container."
hints:
  DockerRequirement:
    dockerPull: debian:stretch-slim
inputs:
  file1:
    type: File
    label: Input File
    doc: "The file that will be copied using 'cat'"
    inputBinding: {position: 1}
outputs:
  output_file:
    type: File
    outputBinding: {glob: output.txt}
baseCommand: cat
stdout: output.txt

DockerRequirement で使用するコンテナイメージを指定することで、そのイメージ内に含まれているツールをコンテナランタイムを用いて実行することが可能になります。上の例だと debian:stretch-slim イメージ中の cat コマンドを使用しています。また、コンテナ内からファイルを参照するためのコマンドオプション設定などは、実行処理系が全て自動でやってくれます。

コンテナイメージは自分で作成することもできますが、例えば生命科学分野であれば、BioContainers などのコミュニティがツールのコンテナ化を行って提供してくれている場合もあるため、可能であればコミュニティやツールの作者自身が提供しているコンテナイメージを利用するといいでしょう。

また DockerRequirement という名前が付いていますが、コンテナランタイムは必ずしも Docker でなくてもかまいません。実行処理系によっては、uDockerSingularity に対応している場合があるため、管理者権限がない環境でもコンテナが利用できるかもしれません。

おまけ

今年は2020年です。この記事にもあるように

  • 2020年代はツールのインストールをしたら負け

だと思ってください。心温まる手作業でツールをインストールするのは平成までです。

さらに言えば、自分でコンテナイメージを作成するのも平成までです。可能な限りコミュニティが作成したイメージを使いましょう。

大事なことなのでもう一回

  • 手作業でツールのインストールをしたら負け
    • 再現性が必要なツールについてはコンテナを使いましょう
    • それができない場合、brewapt などのパッケージマネージャを使ってインストールしましょう
  • 手作業でコンテナイメージをビルドしても負け
    • BioContainers などのコミュニティが提供しているコンテナを使いましょう
  • 以下の場合のみ、苦虫を噛み潰したような顔をしながらコンテナのビルドや手作業のインストールを行いましょう
    • 対応するコンテナがコミュニティから提供されていない場合
      • ビルドできたら、コミュニティに還元できるかを考えてみましょう!うまくいけば、自分でコンテナを管理する必要がなくなるかもしれません!(管理をコミュニティに押し付けるスタイル)
    • 各種パッケージマネージャーでも提供されていない場合
    • セキュリティ上の理由
    • ツールの作者が自分
脚注
  1. つまり、Process requiremens を含むワークフローやツール定義は、全ての CWL 準拠のワークフロー実行処理系で動かせるわけではありません。詳細は別記事を参照してください。 ↩︎