3. Docker 部署:拉取镜像,运行容器,挂载数据目录,测试运行

咱们为什么要用 Docker?说白了,生物信息学最大的痛点就是环境可重复性。你今天在 Ubuntu 20.04 上跑通了,明天队友在 CentOS 7 上就不一定了。InterProScan 又有 Java、又有 Perl、还有一堆 Python 依赖,光装依赖就能折腾一天。我自己的血泪教训是:有一次帮隔壁实验室部署 5.55 版,对方系统自带的 Java 8 太老,跑了一天卡在数据库连接上……后来换成 Docker,五分钟搞定。所以这一章,咱就把 Docker 这条路走通。

3.1 准备工作:先装好 Docker

不多说,直接上命令。我个人习惯用官方脚本装,干净且版本新。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

装完记得把当前用户加入 docker 组,不然每次都要 sudo,烦得很。

sudo usermod -aG docker $USER
newgrp docker

验证一下:

docker --version
# 输出类似 Docker version 24.0.7, build afdd53b
我的小提示: 如果你在服务器上操作,而且遇到 Cannot connect to the Docker daemon,大概率是用户组没生效。退出来重新登录一次就好了。别问我怎么知道的……

3.2 拉取 InterProScan 镜像

InterProScan 官方镜像放在 Docker Hub 上,标签很规矩:版本号-数据库日期。我建议拉最新的稳定版。比如 5.64‑96.0:

docker pull biocontainers/interproscan:5.64-96.0

为啥这么慢?因为镜像大概 4~5 GB,包含数据库。我第一次拉的时候等了半小时,中间还断了三次。解决办法是配个国内镜像加速器,别死磕。比如用阿里云的:

sudo vim /etc/docker/daemon.json
# 写入:
{
  "registry-mirrors": ["https://你的加速地址.mirror.aliyuncs.com"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker

拉完后确认一下:

docker images | grep interproscan
注意: InterProScan 5.64 开始只支持 x86_64 架构。如果你在 ARM 的 Mac(M1/M2)上跑,需要加 --platform linux/amd64 参数。我曾经在 M1 上忘加,容器直接挂了,错误信息特别抽象。

3.3 运行容器 & 挂载数据目录

镜像里自带数据库,但你跑完的结果如果不挂载宿主机目录,停下来就没了。所以必须先准备好数据挂载点。我一般这么组织:

mkdir -p ~/interproscan/{input,output}
cd ~/interproscan

然后把你的序列文件(比如 test.fasta)放到 input 文件夹里。

运行容器时最核心的参数就几个:

  • -v:挂载卷,把宿主机目录映射到容器里
  • --rm:运行完自动删除容器,避免占空间
  • --cpus / --memory:限制资源,防止把服务器撑爆

我常用的命令示例:

docker run --rm \
  -v $(pwd)/input:/input \
  -v $(pwd)/output:/output \
  --cpus 4 --memory 8g \
  biocontainers/interproscan:5.64-96.0 \
  /opt/interproscan/interproscan.sh \
  -i /input/test.fasta \
  -o /output/test_result.tsv \
  -f TSV

嗯,这里要注意:容器内的软件路径是 /opt/interproscan/interproscan.sh,不是 interproscan.sh 直接可执行。如果不清楚路径,可以用 docker run --rm -it biocontainers/interproscan:5.64-96.0 bash 进去看看。

3.4 测试运行:拿小序列试试手

别上来就跑几百条序列。我在项目中吃过这个亏:数据库加载就要 2 分钟,跑 1 条序列和跑 100 条序列的总时间几乎一样,因为数据库初始化是瓶颈。所以先用 1~2 条序列验证整个流程通不通。

创建一个简单的 FASTA:

cat > ~/interproscan/input/test.fasta << EOF
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4
MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP
DEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAK
SVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHHE
RCSDSDGLAPPQHLIRVEGNLRVEYLDDRNTFRHSVVVPYEPPEVGSDCTTIHYNYMCNS
SCMGGMNRRPILTIITLEDSSGNLLGRNSFEVRVCACPGRDRRTEEENLRKKGEPHHELP
PGSTKRALPNNTSSSPQPKKKPLDGEYFTLQIRGRERFEMFRELINEALEELKDAQAGKE
PGGSRAHSSHLKSKKGQSTSRHKKLMFKTEGPDSD
EOF

现在跑一下:

docker run --rm \
  -v ~/interproscan/input:/input \
  -v ~/interproscan/output:/output \
  --cpus 2 --memory 4g \
  biocontainers/interproscan:5.64-96.0 \
  /opt/interproscan/interproscan.sh \
  -i /input/test.fasta \
  -o /output/test_result.tsv \
  -f TSV \
  --disable-precalc

加上 --disable-precalc 是因为测试时不需要预计算匹配,能快很多。正常跑大数据时去掉这个参数。

如果成功,终端会输出类似:

2023-08-20 10:23:45,321 INFO  [main] - InterProScan 5.64-96.0 started
2023-08-20 10:23:45,323 INFO  [main] - Loading sequences from /input/test.fasta
...
2023-08-20 10:25:12,988 INFO  [main] - Finished. 1 sequence(s) analysed. Results written to /output/test_result.tsv

然后查看结果:

head ~/interproscan/output/test_result.tsv
关键参数速查表:
参数作用我的建议值
-f输出格式TSV(后续好解析)
--disable-precalc跳过预计算匹配只用于测试
--cpusCPU 核数不超过物理核数
--memory内存限制至少 4 GB,大数据建议 16 GB+

3.5 避坑指南——我自己踩过的那些坑

  • 权限问题:容器内进程默认以 root 运行,但挂载的宿主目录所属用户可能不是你。结果文件会变成 root 的。解决办法:在 docker run 里加 --user $(id -u):$(id -g)。我一开始不知道,每次都得 sudo 删文件。
  • 磁盘空间:数据库解压后接近 10 GB,加上镜像本身就大。确保 /var/lib/docker 所在分区有余量。我吃过一次告警,那次是日志文件把磁盘塞满了。
  • 网络代理:公司内网拉不到 Docker Hub?设置 HTTP_PROXY 环境变量,或者用私有 registry。我曾在某云上配过 3 次才通。
  • 数据库版本不匹配:镜像里的数据库是固定的,如果你需要更新数据库,最好重新拉一个新标签的镜像,别手动去改容器里的文件,容易被覆盖。

总结一下,Docker 部署 InterProScan 的核心就三步:拉镜像、挂目录、跑测试。搞定了这些,后面批量注释就顺理成章了。

Docker 部署 InterProScan 工作流程 ① 拉取镜像 ② 创建挂载目录 ③ 运行容器 ④ 测试运行 ⑤ 检查结果 注意:每次测试后结果输出到挂载目录,容器删除后数据不丢失