DockerコンテナのSingularity移植で詰まったのでメモ

[[バイオインフォ向け]俺のDocker & Singularity環境メモ
](https://qiita.com/Yohei__K/items/ffbc07454aceb459d6c1)

この続きです。
DockerコンテナをSingularity pullしたらそのままだと動かなかったのでその顛末を書きます。

# 単純に移植できない原因

Dockerではコンテナ内でroot権限が与えられているのに対しSingularityでは権限が制限されています。

[Support for Docker and OCI — Singularity container 3.1 documentation](https://www.sylabs.io/guides/3.1/user-guide/singularity_and_docker.html#best-practices)

上記のドキュメントを読むと、

 - root権限を持っていれば、ユーザに`capability`を付与することで一時的に権限を与える方法がある
 - 環境変数はDockerFile内に`ENV`で書け、`.bashrc`とか使うな
 - /root を使うインストールをするな
 - `$HOME` とか `$TMP` にソフトウェアをインストールするのも良くない
 - `docker run --read-only --tmpfs /run --tmpfs /tmp godlovedc/lolcow` 使うとファイルシステム周りで変なこと起きてないかチェックできるよ

とか色々書いてあるのですけど、あんま具体的にどうしろ、というのが無かったので僕のケースを書いておきます。

# 僕のケース

Docker環境で通っていたコマンドが、Singularity移植したら通らなくなった。
以下遺伝研スパコン内での`Singularity Shell`内部でのログ。

```bash
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は [公式のドキュメント](https://cutadapt.readthedocs.io/en/stable/installation.html) に従いpipを使って `pip3 install --user --upgrade cutadapt`のようにインストールしている。

また、そもそも`Singularity Shell`内部では権限的にpipが使えないっぽいが、`singularity pull`自体は権限ある環境でやってるので大丈夫そう。とするとやはりインストールディレクトリがダメなのかな。

python moduleのpath確認

```bash
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を見てみる

```console

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環境で検証するのに１時間ほどかかってしまう。。。)

手元でSingularity Containerを作ればこのだるさは解消できるはずなのだけれど、[#WorkflowDevMeetup](https://github.com/manabuishii/workflow-meetup/wiki/20180418) で聞いてみたところ現状ではあんまりSingularity Containerを直で作る人いないっぽいのでとりあえずは今の構成で頑張るか。