[バイオインフォ向け]俺のDocker & Singularity環境メモ
この続きです。
DockerコンテナをSingularity pullしたらそのままだと動かなかったのでその顛末を書きます。
単純に移植できない原因
Dockerではコンテナ内でroot権限が与えられているのに対しSingularityでは権限が制限されています。
Support for Docker and OCI — Singularity container 3.1 documentation
上記のドキュメントを読むと、
- root権限を持っていれば、ユーザに
capability
を付与することで一時的に権限を与える方法がある - 環境変数はDockerFile内に
ENV
で書け、.bashrc
とか使うな - /root を使うインストールをするな
-
$HOME
とか$TMP
にソフトウェアをインストールするのも良くない -
docker run --read-only --tmpfs /run --tmpfs /tmp godlovedc/lolcow
使うとファイルシステム周りで変なこと起きてないかチェックできるよ
とか色々書いてあるのですけど、あんま具体的にどうしろ、というのが無かったので僕のケースを書いておきます。
僕のケース
Docker環境で通っていたコマンドが、Singularity移植したら通らなくなった。
以下遺伝研スパコン内でのSingularity Shell
内部でのログ。
Singularity metagenome-pipeline-latest.img:/root> cutadapt
Traceback (most recent call last):
File "/root/.local/bin/cutadapt", line 7, in <module>
from cutadapt.__main__ import main
ModuleNotFoundError: No module named 'cutadapt'
Singularity metagenome-pipeline-latest.img:/root> which cutadapt
/root/.local/bin/cutadapt
/root/.local/bin/cutadapt
にアクセスできてはいるが、 python のmoduleとしてのcutadaptが見れていない。
ここでcutadaptは 公式のドキュメント に従いpipを使って pip3 install --user --upgrade cutadapt
のようにインストールしている。
また、そもそもSingularity Shell
内部では権限的にpipが使えないっぽいが、singularity pull
自体は権限ある環境でやってるので大丈夫そう。とするとやはりインストールディレクトリがダメなのかな。
python moduleのpath確認
Singularity metagenome-pipeline-latest.img:/root> python3
Python 3.5.2 (default, Apr 23 2019, 03:09:46)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
'/root',
'/usr/local/lib/python3.6/dist-packages',
'/usr/local/lib/python35.zip',
'/usr/local/lib/python3.5',
'/usr/local/lib/python3.5/plat-linux',
'/usr/local/lib/python3.5/lib-dynload',
'/usr/local/lib/python3.5/site-packages']
Singularity Containerだと pip3 show
が通らなかったので元のDocker Containerの中からcutadaptのpathを見てみる
root@402bb7b7a5bb:~# pip3 show cutadapt
Name: cutadapt
Version: 2.1
Summary: trim adapters from high-throughput sequencing reads
Home-page: https://cutadapt.readthedocs.io/
Author: Marcel Martin
Author-email: marcel.martin@scilifelab.se
License: MIT
Location: /root/.local/lib/python3.6/site-packages
Requires: xopen, dnaio
Required-by:
root@402bb7b7a5bb:~# ls /root/.local/lib/python3.6/site-packages
__pycache__ cutadapt cutadapt-2.1.dist-info dnaio dnaio-0.3.dist-info xopen-0.5.0.dist-info xopen.py
なるほど、cutadaptだけ--user
オプションをつけたせいで /root/.local/lib/python3.6/site-packages
以下にインストールされており(他は全て /usr/local/lib/python3.6/dist-packages
以下)、そこがSingularityの権限だとアクセスできないようだ。
cutadaptのインストールコマンドを pip3 install --user --upgrade cutadapt
-> pip3 install cutadapt
と書き換えたら解決した。
感想
思ったより簡単に解決できた。が、この手の対処はデプロイまでの作業がだるすぎるのをなんとかしたい
(DockerHubのビルド待ち、Singularity Pullの手間、などなどで小さな変更でもSingularity環境で検証するのに1時間ほどかかってしまう。。。)
手元でSingularity Containerを作ればこのだるさは解消できるはずなのだけれど、#WorkflowDevMeetup で聞いてみたところ現状ではあんまりSingularity Containerを直で作る人いないっぽいのでとりあえずは今の構成で頑張るか。