CWLでudocker を利用してみる
@tm_tn さんが 雑に始める CWL!を書いているので、この内容を利用してcwltoolのudockerを利用する機能を使用してみる
udockerの準備
udockerをインストールして欲しい手順は2. クラスター計算機で udocker を利用する: インストール編等を参照
curlのバージョンが古いと正常に動作しないので、その時はcurlをバージョンアップしよう!
udockerをカレントディレクトリにインストールしているので、PATHを通しておこう
cwlを記述する
雑に始める 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をクラスタに分散する場合には特に留意が必要
今回はここまで