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
--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 | 跳过预计算匹配 | 只用于测试 |
--cpus | CPU 核数 | 不超过物理核数 |
--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 的核心就三步:拉镜像、挂目录、跑测试。搞定了这些,后面批量注释就顺理成章了。