Edited at

雑に始める CWL!でudockerを利用する


CWLでudocker を利用してみる

@tm_tn さんが 雑に始める CWL!を書いているので、この内容を利用してcwltoolのudockerを利用する機能を使用してみる


udockerの準備

udockerをインストールして欲しい手順は2. クラスター計算機で udocker を利用する: インストール編等を参照

curlのバージョンが古いと正常に動作しないので、その時はcurlをバージョンアップしよう!

udockerをカレントディレクトリにインストールしているので、PATHを通しておこう


cwlを記述する

雑に始める CWL!のそれをそのまま利用する

内容は次の通り


head.cwl

cwlVersion: v1.0

class: CommandLineTool
baseCommand: [head]
arguments: [-n$(inputs.nlines), $(inputs.source)]
inputs:
- id: source
type: File
- id: nlines
type: int
outputs:
- id: out
type: stdout
stdout: $(inputs.source.nameroot)-head.txt
requirements:
- class: DockerRequirement
dockerPull: alpine:latest

処理対象のファイルの作成方法も改めて記載しておく

$ man head > manhead.txt


udocker を利用して実行

いよいよudockerを利用して実行してみる

cwltool に--user-space-docker-cmd=udocker を指定してdockerの代わりにudockerを利用するようにする

$ cwltool  \

--user-space-docker-cmd=udocker \
head.cwl \
--source manhead.txt\
--nlines 5

実行結果は次の通り

$ cwltool      --user-space-docker-cmd=udocker     head.cwl     --source manhead.txt    --nlines 5

/home/usr1/.udocker/bin/cwltool 1.0.20181217162649
Resolved 'head.cwl' to 'file:///home/usr1/work/cwl/head.cwl'
[job head.cwl] /tmp/OiEMR1$ udocker \
--quiet \
run \
--volume=/tmp/OiEMR1:/bDkEhV \
--volume=/tmp/0h3_Oq:/tmp \
--volume=/home/usr1/work/cwl/manhead.txt:/var/lib/cwl/stga57d9eba-5c74-4201-8ae7-a81c633fd6e7/manhead.txt \
--workdir=/bDkEhV \
--rm \
--env=TMPDIR=/tmp \
--env=HOME=/bDkEhV \
alpine:latest \
head \
-n5 \
/var/lib/cwl/stga57d9eba-5c74-4201-8ae7-a81c633fd6e7/manhead.txt > /tmp/OiEMR1/manhead-head.txt
[job head.cwl] Max memory used: 12MiB
[job head.cwl] completed success
{
"out": {
"checksum": "sha1$2520a3daad4351ed428f758236710d4c703f2362",
"basename": "manhead-head.txt",
"location": "file:///home/usr1/work/cwl/manhead-head.txt",
"path": "/home/usr1/work/cwl/manhead-head.txt",
"class": "File",
"size": 158
}
}
Final process status is success

作成されたmanhead-head.txtを確認すると正常に動作した事がわかる


Job Schedulerを利用する

udockerの醍醐味はdockerをインストールできない環境でもdockerコンテナを利用できるということ

ここではUniva Grid Engineを利用して同じ処理をdocker環境の無いクラスターのノードにサブミットしてみる

その前にmanhead-head.txtを別名に変更しておこう

$ mv manhead-head.txt manhead-head_back.txt

下記では次の一連の作業を実行


  • qsubでのジョブのサブミット qsub -jc ジョブ実行用のキュー -cwd -b y 実行するコマンド

  • フォルダ上のファイルの確認

  • 結果の比較を行い出力に差が無い事を確認

$ qsub -jc ジョブ実行用のキュー -cwd -b y cwltool --user-space-docker-cmd=udocker head.cwl --source manhead.txt --nlines 5

Your job 4661722 ("cwltool") has been submitted
$ ls
cwltool.e4661722 cwltool.o4661722 head.cwl manhead-head.txt manhead-head_back.txt manhead.txt udocker
$ diff manhead-head.txt manhead-head_back.txt
$

このようにして、cwltoolとudockerを利用して結果を得られた

注意


  • コンテナ上のツールがudockerの環境下で正しく動作するかについて先に検証しておくこと

  • ジョブを実行した数だけ、コンテナを展開した結果がディスク上に残るので適切な方法でこれを消去すること


    • 大量のJobをクラスタに分散する場合には特に留意が必要



今回はここまで:smile: