Skip to content

基于docker的生信基础环境镜像构建

本文是《转录组RNA-Seq使用docker+bioconda实现分析环境搭建》一文的升级版,下面解决几个问题:

Q:为什么不使用本地部署运行docker容器模式?而使用带ssh服务的docker镜像?
A:单机毕竟容量资源、算力有限不可能做太多扩展,带ssh的docker部署连接基于网络,扩展性更好。

Q:为什么对上文docker用法升级?
A:毕竟docker又用了一段时间,有些提高,毕竟本地通过docker commit提交获取docker镜像的方式一来会造成docker镜像体积飙升,不便于移植;二来也不是官方推荐的使用方法,能用但是不推荐;近来有时间就想再完善下。

Q:如何安装docker和docker-compose?
A:安装docker和docker-compose:

shell
#docker极速安装,快速完成不浪费时间
curl  -sSfL get.docker.io -o get_docker.sh
bash  get_docker.sh --mirror Aliyun

#较新版本的Docker上述安装脚本直接安装了docker-compose-plugin,用来替换早期的docker-compose,也可以手动安装
sudo apt-get install docker-compose-plugin
#使用方法类似于docker-compose,替代命令为docker compose其余参数基本一致
docker compose up -d

#安装docker-compose 1.x版本
#从以下网址下载docker-compose,将docker-compose文件放在path变量目录下如:/usr/local/bin并增加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
https://github.com/docker/compose/releases

Dockerfile如下:

docker
#从Ubuntu20.04镜像开始构建,Ubuntu22.04据说会不定期杀掉占用资源过多的进程
FROM        ubuntu:20.04
#1.设置账户字符编码为C.UTF-8,提高兼容性;设置时区,ssh登录密码为20201110(账户为root),连接端口为9022
ENV         LANG=C.UTF-8 TZ=Asia/Shanghai PS=20201110 port=9022
#设置时区、更新镜像软件、安装aria2(下载工具替代wget,curl以获取更快的下载速度,容错/下载会自动重试)
#openssh服务并更新配置文件,使root账户可以登录、更新root账户密码为设置值
RUN         ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
            apt update && apt upgrade -y && apt install openssh-server aria2 -y && apt autoremove -y
RUN         sed -i "s/#PermitEmptyPasswords no/PermitEmptyPasswords no/g" /etc/ssh/sshd_config && \
            sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config && \
            sed -i "s/#Port 22/Port ${port}/g" /etc/ssh/sshd_config && \
            sed -i "s/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/g" /etc/ssh/sshd_config && \
            sed -i "s/#LoginGraceTime 2m/LoginGraceTime 2m/g" /etc/ssh/sshd_config && \
            echo root:${PS} | chpasswd
#aria2下载miniconda、安装、添加channel、删除安装文件(减小镜像体积)、初始化miniconda
RUN         aria2c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -d ~ && \
            bash ~/Miniconda3-latest-Linux-x86_64.sh -b && \
            ~/miniconda3/bin/conda config --add channels defaults    && \
            ~/miniconda3/bin/conda config --add channels bioconda    && \
            ~/miniconda3/bin/conda config --add channels conda-forge && \
            rm -f ~/Miniconda3-latest-Linux-x86_64.sh && \
            ~/miniconda3/bin/conda init
#复制该文件到镜像root目录下,condarc为清华源配置文件,国内提速可以注销该行
#COPY       --chown=root:root ./condarc /root/.condarc
#暴露ssh连接端口
EXPOSE      $port
#初始化镜像运行:根据配置项变量PS修改root密码,该密码可以运行时重新设置初始化,最后启动ssh服务
ENTRYPOINT  ["/bin/bash", "-c", "echo root:${PS} | chpasswd && service ssh start -D"]

构建镜像或者从docker hub拉取镜像

shell
#将condarc文件和dockerfile放在同一目录下,构建镜像
docker     build -t doujiangbaozi/sliverworkspace:latest .

#或者使用已经构建好的镜像,直接拉取到本地
docker     pull     doujiangbaozi/sliverworkspace:latest

condarc文件(可选,这里使用的是清华的源):

yaml
channels:
  - conda-forge
  - bioconda
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

如何使用该镜像:

推荐使用docker-compose,配置文件docker-compose.yml如下

yaml
version: "3"
services:
  TumorOnly:
    image: doujiangbaozi/sliverworkspace:latest
    container_name: TumorOnly
    volumes:
      - /media/sliver/Data/data:/opt/data:rw                               #挂载输入数据目录
      - /media/sliver/Manufacture/tumor-only/envs:/root/miniconda3/envs:rw #挂载envs目录
      - /media/sliver/Manufacture/tumor-only/config:/opt/config:rw         #挂载config目录
      - /media/sliver/Manufacture/sliver/ref:/opt/ref:rw                   #挂载reference目录
      - /media/sliver/Manufacture/tumor-only/result:/opt/result:rw         #挂载中间文件和结果目录
    ports:
      - "9022:9022"                                                        #ssh连接端口,此处可以映射为其他端口
    environment:
      - TZ=Asia/Shanghai                                                   #设置时区
      - PS=20191124                                                        #设置ssh密码

在docker-compose.yml文件目录下运行docker-compose up -d 即可运行;

查看docker运行状态

shell
#查看docker容器运行状态
docker ps

#或者docker-compose.yml目录下运行
docker-compose ps

如何使用该docker搭建pipeline?

ssh 登录该容器ssh账户,即可在环境下开始生信分析

这里参考snakemake的写法,每个分析步骤创建一个yaml文件,里面是用到的软件及版本。首次运行检测该步骤环境存在,不存在先安装软件初始化。

shell
#用到的环境变量,以最简单的fastqc,multiqc为例
export env=/root/miniconda3/envs  #conda环境软件安装目录,最好挂载物理机volume
export conf=/opt/config           #conda环境配置文件目录
export sn=RD1703007FFP            #样本编号,sample  number
export pn=TumorOnly               #项目编号,project number
export result=/opt/result         #中间文件输出目录

#conda检测环境是否存在,首次运行不存在创建该环境并安装软件
if [ ! -d "${envs}/${pn}.fastqc" ]; then
  conda env create -f ${conf}/fastqc.yaml
fi
#切换到环境下运行fastqc、multiqc
conda activate "${pn}.fastqc"
mkdir  -p ${result}/${sn}/qc
fastqc -o ${result}/${sn}/qc \
    ${result}/${sn}/trimmed/${sn}_trimmed_R1.fastq.gz \
    ${result}/${sn}/trimmed/${sn}_trimmed_R2.fastq.gz
multiqc ${result}/${sn}/ -f -o ${result}/${sn}/qc
#退出环境
conda deactivate

fastqc.yaml文件如下,文件位于/opt/config目录下

yaml
name: TumorOnly.fastqc
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - fastqc=0.11.9
  - multiqc=1.13a

后续便于搭建整个分析流程。待续。。。。