构建Docker镜像实例
一、认识Dockerfile
Dockerfile是用来描述文件的构成的文本文档,其中包含了构成镜像的所有命令,通过docker build 命令识别Dockerfile可以自行构建镜像。
通过Dockerfile生成的镜像,可以明确知道镜像中所包含的软件和生成过程。
Dockerfile常用语法只有11个:
示例:
官方Dockerfile一----conda/miniconda3
https://hub.docker.com/r/conda/miniconda3/dockerfile
FROM debian:latest
MAINTAINER Conda Development Team <conda@continuum.io>
RUN apt-get -qq update && apt-get -qq -y install curl bzip2 \
&& curl -sSL https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -o /tmp/miniconda.sh \
&& bash /tmp/miniconda.sh -bfp /usr/local \
&& rm -rf /tmp/miniconda.sh \
&& conda install -y python=3 \
&& conda update conda \
&& apt-get -qq -y remove curl bzip2 \
&& apt-get -qq -y autoremove \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/* /var/log/dpkg.log \
&& conda clean --all --yes
ENV PATH /opt/conda/bin:$PATH
解读:
1.基于镜像debian:latest(Debian是一种操作系统,等比ubuntu)
2.作者是Conda官方
3.执行命令是升级apt-get和下载miniconda安装包并解压、安装。
4.最后是讲conda安装路径加入到环境变量中。
官方Dockerfile二----makaho/hisat2-zstd
https://hub.docker.com/r/makaho/hisat2-zstd/dockerfile
# Set the base image to debian based miniconda3
FROM conda/miniconda3
# File Author / Maintainer
MAINTAINER Matthias Becker
RUN conda config --add channels r
RUN conda config --add channels defaults
RUN conda config --add channels conda-forge
RUN conda config --add channels bioconda
RUN conda install -y hisat2=2.1.0
RUN conda install -y zstd
RUN conda install -y pigz
RUN conda install -y fastp=0.13.1
解读:
1.基于镜像conda/miniconda3,也就是示例一构建的镜像
2.作者是Matthias Becker
3.执行设置conda的下载源的命令
4.使用conda下载对应的软件。
官方Dockerfile三----yyabuki/stringtie
https://hub.docker.com/r/bmennis/stringtie/dockerfile
FROM ubuntu:18.04
RUN \
apt-get update && apt-get -y upgrade && apt-get install -y build-essential make git wget zlib1g-dev libbz2-dev && \
wget -c http://ccb.jhu.edu/software/stringtie/dl/stringtie-1.3.6.tar.gz && \
tar -zxvf stringtie-1.3.6.tar.gz && \
cd stringtie-1.3.6 && \
make && \
cp stringtie /usr/local/bin
解读:
1.基于镜像ubuntu:18.04
2.相应升级后下载stringtie安装包并解压
3.make编译(不少生信软件解压后需要make编译)
二、简洁明了的Dockerfile
编写简介的Dockerfile主要需要以下几点:
- Dockerfile层级不宜过多,越多镜像越大。
- 构建过程中及时删除无用的log文件、压缩包等。
- 需要安装通关网络下载的安装包,可以先手动下载,通过add命令添加进镜像
拿第一个官方的Dockerfile示例来看
推荐
RUN apt-get -qq update && apt-get -qq -y install curl bzip2 \
&& curl -sSL https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -o /tmp/miniconda.sh \
&& bash /tmp/miniconda.sh -bfp /usr/local \
&& rm -rf /tmp/miniconda.sh \
&& conda install -y python=3 \
&& conda update conda \
&& apt-get -qq -y remove curl bzip2 \
&& apt-get -qq -y autoremove \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/* /var/log/dpkg.log \
&& conda clean --all --yes
不推荐
RUN apt-get -qq update && apt-get -qq -y install curl bzip2 \
RUN curl -sSL https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -o /tmp/miniconda.sh \
RUN bash /tmp/miniconda.sh -bfp /usr/local \
RUN rm -rf /tmp/miniconda.sh \
RUN conda install -y python=3 \
RUN conda update conda \
RUN apt-get -qq -y remove curl bzip2 \
RUN apt-get -qq -y autoremove \
RUN apt-get autoclean \
RUN rm -rf /var/lib/apt/lists/* /var/log/dpkg.log \
RUN conda clean --all --yes
简单看第二种好像更加规整,但第二种所用的层级更多,这会导致占用更多的空间,这个看上去差别不大,但当是用conda安装R包的时候,差异更加明显。
第二种也有优点,如果中间某一步因为使用网络安装软件等问题中断时,重新built镜像,第一种就会重新开始,而第二种会在报错的前一个层级继续往下构建镜像,在时间上有节约。
因此,推荐先手动在镜像中测试安装命令,大文件先手动下载到本地,然后通过add等添加到镜像中,可以节省很多测试时间。