yNagaokaのブログ

このブログはNGS解析初心者がつまずいた部分と解決方法をまとめた覚書のようなものです。

Singularityとは何か?の覚書ーその3

はじめに

Singularityのイメージやインストール方法が分かったところで、今回はどうやって使うのかに関してまとめたいと思います。

Singularityの使い方

基本的にはDockerと同様にimageからコンテナを作成して実行します。
・SingularityのコンテナであるSingularity Image File (SIF)をbuildします。
・SIFコンテナに対して、アクセス(shellやrun, exec)することで使用します。
 ※SIFコンテナは読取専用ファイルでコンテナ内で編集することはできません。

SIFのbuild方法は主に5つあります。目当てのコンテナが以下の場所にあれば簡単にbuildすることができます。
1.Container Libiraryから
2.Docker Hubから
3.Singularity Hubから
4.マシン上の既存のコンテナから
5. Singularity Definition Fileから
※SIFにすると動かないDocker imageがあるようです。もう少し勉強が必要だと感じてます。

Singularityの使い方-実践

今回はRNA-seqの解析ツールであるRumBallを例にして、SIFをbuildして使用してみたいと思います。

RumBall
GitHubhttps://github.com/rnakato/RumBall  Manual: https://rumball.readthedocs.io/en/latest/ 

SIFのbuildは以下のコマンドで行います。

$ singularity build <SIF name> <インストール元>
$ singularity build rumball.sif docker://rnakato/rumball #今回の例 

今回はDocker Hub に公開されているRumBallからrumball.sifを作成しています。 rumball.sifがSIFコンテナでありRNA-seq解析に必要なツールがインストールされています。
注意点はRamBall内でインストールされているツールは使用できますが、インストールされていないものは使用できません。ツールが足りないからと言って自分でインストールしてSIFコンテナに追加することはできません。
実行は、shell, run, execで行います。

shell

コンテナ内でShellを実行する.%runscript などは実行されずShellが起動する。デフォルトのShellは Bash が起動する。--shell でShellを指定することも可能。コンテナ内で、定義されたコマンドを実行する。

$ singularity shell <SIF name>
$ singularity shell rumball.sif  #例
  Singularity> <command>

run

コンテナ内でユーザ定義のデフォルトコマンドを実行する。sifファイルの作成時に指定できる %runscript が実行される。%runscript が指定されていない場合はShellが立ち上がる。

$ singularity run <SIF name> <command>

exec

execは run の部分をexecにするだけです。違いはコンテナ内でコマンドを実行するがコンテナを作成してから run するのではなく、sifファイルに直接コマンドを投げる点です。

$ singularity exec <SIF name> <command>

個人的にはexecを使う場合が多いかと思います。
注意点ですがshell, run, execともにデフォルトは$homeがマウントされています。

$ singularity shell rumball.sif
   Singularity> pwd
   /home/nagaoka
   Singularity> exit

マウントポジションを指定する場合は--bindオプションを使います。複数のディレクトリをマウントする場合は , で続けて記載します。

$ singularity shell --bind <directory> <SIF name> #run,execも同じ

$ singularity shell --bind /work,/work2 rumball.sif #例
   Singularity> pwd
   /work/Nagaoka/rumball/worktest

また、GPUを使用してコマンドを実行したい場合は--nvオプションを使用します。

 $ singularity exec --nv --bind <directory> <SIF name> <command>

基本的な使い方は以上で、あとは<command>の用法があっていれば解析ができます。 Dockerと異なりコンテナを立ち上げては消すというような作業が不要であり、外部のディレクトリを参照しやすいため非常に使い勝手が良いです。 一方で、SIFの中身を編集することはできないためツールにバグがあっても自分で修正することができません。また、SIFの作製に使用したimageが更新された場合は都度SIFのBuildが必要になります。