mecobalamin’s diary

人間万事塞翁が馬

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 の命令を読み込み、自動的にイメージを構築できます。

docs.docker.jp

平たく言えばダウンロードした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
stats — Docker-docs-ja 19.03 ドキュメント


Dockerの使い方で調べると
ウェブサーバーとして使っていたりするらしい
もしかしたらJBrowseを実行するのに良かったりして
そのうち時間があれば作ってみたい

8 May 2020 追記
計算に使っていたPCが落ちてた
つい3時間前までは動いていたのに・・・
再起動後にログイン画面ならわかるが
BIOS画面になっていたのが気になる

20時間ぐらいやっていたことが全部消えてしまった
virtual machineも当然落ちたので記録なし
出力先をホスト側にしないとこんなとき何も残らないな
追記ここまで