从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
还以之前定制 centos7 镜像为例,这次我们使用 Dockerfile 来定制。
在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:
$ mkdir mydocker
$ cd mydocker
$ touch Dockerfile
其内容为:
# Base image
FROM centos:centos7
################## METADATA ######################
LABEL base.image="centos:7" \
version="1" \
software="Biocontainers base Image" \
software.version="20200312" \
about.summary="Base image for omicsclass" \
about.home="www.omicsclass.com" \
about.documentation=" " \
license=" " \
about.tags="Genomics,Proteomics,Transcriptomics,General,Metabolomics"
################## MAINTAINER ######################
MAINTAINER huangls <huang2002003@qq.com>
#COPY Miniconda3-latest-Linux-x86_64.sh /tmp/miniconda.sh
#ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV PATH /biosoft/miniconda/bin:$PATH
RUN yum -y update && yum upgrade -y \
&& yum -y install bzip2 openssl openssh-clients\
cmake zlib libpng libpng12 libtiff libjpeg boost \
wget zip which less tree \
&& yum clean all \
&& mkdir -p /biosoft/miniconda \
&& wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh \
&& bash /tmp/miniconda.sh -bfp /biosoft/miniconda \
&& rm -rf /tmp/miniconda.sh \
&& ln -s /biosoft/miniconda/etc/profile.d/conda.sh /etc/profile.d/conda.sh \
&& echo ". /biosoft/miniconda/etc/profile.d/conda.sh" >> ~/.bashrc \
&& echo "alias e=\"less -S \"" >> ~/.bashrc \
&& echo "alias ee=\"less -SN \"" >> ~/.bashrc \
&& echo "alias l=\"ls -lhtr"\" >> ~/.bashrc \
&& echo "alias ll=\"ls -lh\"" >> ~/.bashrc \
&& echo "export PS1=\"\[\e[32m\][\[\e[35m\]\u\[\e[m\]@\[\e[36m\]\h \[\e[31m\] \t \w\[\e[32m\]]\[\e[36m\]#\[\e[m\]\"" >> ~/.bashrc \
#&& conda config --add channels bioconda \
#&& conda config --add channels conda-forge \
#&& conda config --add channels genomedk \
&& conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ \
&& conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/ \
&& conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/mro/ \
&& conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ \
&& conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ \
&& conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/ \
&& conda config --set show_channel_urls yes \
&& conda config --set ssl_verify no \
&& conda clean --all --yes
#RUN conda update conda -y && conda upgrade conda -y \
VOLUME ["/work"]
# Overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]
WORKDIR /work执行
$ docker build -t omicsclass/biocontainer-base:latest . Sending build context to Docker daemon 2.048 kB ...
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!