RNA-seqその10、Dockerで環境構築
RNA-Seqのパイプラインに限らず
他人のスクリプトが自分の環境では
うまく動かないことはよくある話
かと言ってクリーンな環境を
毎回用意もできない
そこでDockerをつかって
クリーンなubuntuに
RNA-Seqのパイプラインを実行できる
環境を作ってみた
作ったのはTrinityを動かす環境
以下の過去記事を参考に構築した
mecobalamin.hatenablog.com
mecobalamin.hatenablog.com
mecobalamin.hatenablog.com
1番目の記事を参考にDockerを動かすことができたら
今回は2番目の記事を参考に120GBのストレージをもつ
Virtual Machineを作成する
3番目の記事を参考にしてWindows-Docker間で
ファイルのやり取りができるようにする
Trinityは出力ディレクトリに
ファイルのシンボリックリンクを作成するが
現状Windows10 homeでは仮想マシンから
ホストにシンボリックリンクを貼れない
そのため出力先はDocker内にし
生成されたファイルは終了後に
Widows側に移動して次の作業に使用する
ホストからゲストにはシンボリックリンクを貼れるので
入力するbamファイルはホストにある
環境構築にDockerfileを利用した
Dockerfileとは以下のようなもの
Docker は Dockerfile の命令を読み込み、自動的にイメージを構築できます。
平たく言えばダウンロードしたubuntuのイメージファイルに
必要なコマンドをインストールする操作を
記述したファイル
このファイルをdockerを使ってビルドすると
必要なコマンドの入ったubuntu imageを作成できる
実際に作ったDockerfileは以下の通り
# install ubuntu FROM ubuntu # set shell type SHELL ["/bin/bash", "-c"] # update apt-get and install commands RUN apt-get update && \ apt-get install -y openjdk-8-jre && \ apt-get install -y less && \ apt-get install -y wget && \ apt-get install -y unzip && \ apt-get install -y vim ENV RNASEQ_PATH=/RNA-Seq ENV TMP_PATH=${RNASEQ_PATH}/tmp ENV CONDA_PATH=${RNASEQ_PATH}/miniconda3 WORKDIR ${TMP_PATH} # install miniconda3 RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh RUN chmod 755 ${TMP_PATH}/Miniconda3-latest-Linux-x86_64.sh && \ ${TMP_PATH}/Miniconda3-latest-Linux-x86_64.sh -b -p ${CONDA_PATH} ENV PATH=${CONDA_PATH}/bin:${PATH} RUN conda update conda && \ conda install -c bioconda trimmomatic=0.39 && \ conda install -c bioconda trinity=2.6.6 && \ conda install -c bioconda ea-utils=1.1.2.779 && \ conda install -c bioconda numpy=1.15.0 && \ conda install -c bioconda hisat2=2.1.0 && \ conda install -c bioconda stringtie=2.1.1 # make directory for shared directory and scripts RUN mkdir -p ${RNASEQ_PATH}/data && \ mkdir -p ${RNASEQ_PATH}/scripts # Perl setting RUN ln -sf ${CONDA_PATH}/lib/libcrypto.so.1.1 ${CONDA_PATH}/lib/libcrypto.so.1.0.0 RUN mv -f /usr/bin/perl /usr/bin/perl.5.30.0 && \ ln -sf ${CONDA_PATH}/bin/perl /usr/bin/ ENV PERL5LIB=${PERL5LIB}:${CONDA_PATH}/lib/5.26.2 # change working directory WORKDIR ${RNASEQ_PATH}
この内容をDockerfileという名前のファイルに保存する
DockerfileのあるディレクトリにはDockerfileのみを保存する
Dockerfileのあるディレクトリで以下のコマンドでビルドする
$ docker build -t hogehoge:hugahuga .
Dockerfileにエラーがなければ
Repositoryがhogehoge
tagがhugahugaの
imageが作成される
作成したimageは以下のコマンドで実行する
docker run --rm -v /e/hoge:/tmp/fuga -it hogehoge:hugahuga /bin/bash
ディレクトリのhogeとfugaは
windowsのディレクトリhogeに
dockerのディレクトリfugaをマウントしつつ
imageのhogehoge:hugahugaを起動している
例えばwindowsのeドライブにあるtmpディレクトリを
今回作ったイメージ内の/RNA-Seq/dataにマウントするなら
この様になる
docker run --rm -v /e/tmp:/RNA-Seq/data -it hogehoge:hugahuga /bin/bash
imageの作り方などは以下の本を参考にした
(Amazonのページに飛びます)
自宅ではじめるDocker入門―人気のコンテナ型「仮想化ソフト」を使ってみる! (I・O BOOKS)
これよりDockerfileの説明
ベースになるのはubuntuのイメージ
Dockerのデフォルトではshを使うのでbashに変更している
/RNA-Seq
というディレクトリを作成し、
それ以下にdata、tmp、scriptsというディレクトリを作成する
dataはwindowsとファイルのやり取りをするディレクトリ
scriptsはTrinityのスクリプトファイルを保存するディレクトリ
tmpはTrinityの一時ファイルを保存する作業ディレクトリ
過去記事をもとにTrinityで使うコマンドを追加する
mecobalamin.hatenablog.com
Javaのバージョンが古いのでアップデートする
lessやwgetも含まれていないことに驚いた
ほんと最小限
もっとサイズの小さなディストリビューションだとどうなるんだろう
pythonも使うのでminicondaをインストール
condaでいくつかパッケージをインストールするが
バージョン指定でインストールしている
Trinityは使えるオプションの関係で2.6.6をインストールしている
指定しないともっと古いバージョンがインストールされる
2.6.6よりも新しいバージョンも存在するが使ったことがない
コンテナ内で使うファイルパスはENVで指定する
${HOME}/.bashrcに記入するのと同じなのかもしれないが
Dockerfileから.bashrcに記入して
sourceコマンドで.bashrcの再読み込みでは
上手くパスを設定できなかった
perlもコマンドとライブラリのシンボリックリンクを貼り直している
最後にWORKDIRを変更している
これでWORKDIRが${HOME}になる
ここまでがDockerfileに記述した処理
以前Trinityの処理に使用したシェルスクリプトにも変更を加えて
/RNA-Seq/scritps/
に保存した
シェルスクリプトは以下の通り
#!/bin/bash echo "Trinity has began" date_begin=`date` dir_scripts="/RNA-Seq/scripts" dir_working="/RNA-Seq/data" dir_tmp="/RNA-Seq/tmp" echo "open sra list" dir_list_sra=${dir_scripts} name_sra="list_sra.txt" list_filename=$(cat ${dir_list_sra}/${name_sra} | sed 's/\.sra//') for i in ${list_filename} do echo "analyze ${i}" file_in="sort_${i}.bam" dir_in="hisat_${i}" dir_out="trinity_${i}" echo "makind directories" mkdir -p ${dir_tmp}/${dir_out} mkdir -p ${dir_tmp}/${dir_out} Trinity \ --genome_guided_bam ${dir_working}/${dir_in}/${file_in} \ --genome_guided_max_intron 10000 \ --verbose \ --output ${dir_tmp}/${dir_out} \ --workdir ${dir_tmp}/${dir_out} \ --CPU 1 \ --max_memory 10G mv ${dir_tmp}/${dir_out}/Trinity-GG.fasta ${dir_tmp}/${dir_out}/Trinity-GG_${i}.fasta TrinityStats.pl ${dir_tmp}/${dir_out}/Trinity-GG_${i}.fasta > \ ${dir_tmp}/${dir_out}/Trinity-GG_${i}.stats done echo ${date_begin} echo `date`
bamファイルはwindows側に保存されていて
結果はDocker側に出力される
スクリプトファイルを加えたimageを保存するなら
docker commitコマンドを使う
$ docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
今回作成したimageのIDはdf2113fdef5eなので
$ docker commit df2113fdef5e hogehoge:hugahuga
とすると
Repositoryがhogehoge
Tagがhugahuga
のimageを作成できる
また
$ docker save hogehoge:hugahuga > hogehoge_hugahuga.tar
を実行するとtar形式で保存されて持ち出せるようになる
つまり他のPCやvirtual machineで使用できるようになる
image idでも保存はできるがそれだと
tarファイルを読み込んだときに
repositoryとtagの情報を失っているので
repository:tagを使ってtarファイルを作るのがよさげ
ここまででDockerにRNA-Seqのパイプラインを実行できる環境を構築できた
Dockerfileを使えば異なるVirtual Machine上にも
Trinityを実行する全く同じ環境が作成できる
あとはDockerの環境構築と
直接WSL上に環境を構築するのとで
どっちが手間がかかるか
ってことかもしれない
Dockerだと他のパイプラインに影響を与えずに
コマンドのアップデートができたり
うまくいかないときに
作り直しするのも楽なのは助かる
それと作成したimageのサイズは2.56GBになった
ベースのubuntuが80MB以下だったので
シークエンスのデータを含まずにこのサイズは
かなり大きい気がする
dfとdocker statsは使用頻度が高かった
【 df 】コマンド――ディスクの空き領域を表示する:Linux基本コマンドTips(58) - @IT
docker stats — Docker-docs-ja 20.10 ドキュメント
Dockerの使い方で調べると
ウェブサーバーとして使っていたりするらしい
もしかしたらJBrowseを実行するのに良かったりして
そのうち時間があれば作ってみたい
8 May 2020 追記
計算に使っていたPCが落ちてた
つい3時間前までは動いていたのに・・・
再起動後にログイン画面ならわかるが
BIOS画面になっていたのが気になる
20時間ぐらいやっていたことが全部消えてしまった
virtual machineも当然落ちたので記録なし
出力先をホスト側にしないとこんなとき何も残らないな
追記ここまで