Dockerfile构建指令、构建解析

1、基础指令

1.1、FROM

语法:
 FROM <image>
 FROM <image>:<tag>
解释: FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令

1.2、MAINTAINER

语法:
 MAINTAINER <name>
 
解释:
 指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息

1.3、RUN

1.3.1、语法介绍

语法:
 RUN <command>                                       (shell模式)
 RUN ["executable", "param1", "param2"]。           (exec 模式)
 
解释:
 表示当前镜像构建时候运行的命令

1.3.2、shell与exec执行模式

模式        格式                                        示例
shell模式   类似于 /bin/bash -c command                 RUN echo hello
exec 模式   类似于 RUN ["/bin/bash", "-c", "command"]   RUN ["echo", "hello"]

1.4、EXPOSE

语法:
 EXPOSE <port> [<port>...]
 
解释:
 设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。

1.5、ENTRYPOINT

语法:
   ENTRYPOINT ["executable", "param1","param2"]         (exec 模式)
   ENTRYPOINT command param1 param2                     (shell模式)
解释:
 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT 该命令不会被覆盖,如果运行容器的时候,添加了命令, 则作为参数交给 ENTRYPOINT 指定的命令 如果该参数不被 ENTRYPOINT 指定的命令承认,则发生报错

1.6、CMD

CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

CMD
该命令会被 运行容器的时候添加的命令 覆盖
在Dockerfile里面可以存在多个CMD但是只有最后一个生效

2、其它指令

2.1、ADD

语法:
   ADD <src>... <dest>
   ADD ["<src>",... "<dest>"]
    
解释:
 将指定的 文件复制到容器文件系统中的
   src 指的是宿主机,dest 指的是容器
   如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。

2.2、COPY

语法:
   COPY <src>... <dest>
   COPY ["<src>",... "<dest>"]
    
解释:
 单纯复制文件场景,Docker推荐使用COPY

2.3、VOLUME

语法:
     VOLUME ["/data"]
    
解释:
 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

2.4、ENV

语法:
   ENV <key> <value>
   ENV <key>=<value> ...
    
解释:
 设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。

2.5、WORKDIR

语法:
 WORKDIR /path/to/workdir                   (shell 模式)
解释:
 切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd

3、构建解析

3.1、基础知识

3.1.1、构建过程

1)从基础镜像1创建一个容器A
2)遇到一条Dockerfile指令,都对容器A做一次修改操作
3)执行完一条指令,提交生成一个新镜像2
4)再基于新的镜像2运行一个容器B
5)遇到一条Dockerfile指令,都对容器B做一次修改操作
6)执行完一条指令,提交生成一个新镜像3
...

3.1.2、构建历史

构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能
看到我们每次构建的效果。
提供了镜像调试的能力,我们可以通过docker history <镜像名> 来查看整个构建过程所产生的镜像

3.1.3、镜像原理

对于Docker镜像文件整体来说,它是一个只读的文件,但是根据我们对构建过程的理解,我们发现,对于
Docker镜像还有很多更深层的东西:
 1 镜像文件是基于分层机制实现的
 - 最底层是bootfs用于启动容器之前系统引导的文件系统,容器启动完毕后,卸载该部分内容以便节省资源
 - 其他层是rootfs,有内核挂载为只读模式,而后通过"联合挂载"在其基础上挂载一个"可写层"
 2 下层镜像是上层镜像的父镜像,最底层的称为基础镜像
 - 最上层的是可写的,其他各层都是只读的。

3.1.4、构建缓存

第一次构建很慢,之后的构建都会很快,因为它们用到了构建的镜像缓存。
不使用构建缓存方法:
全部不用缓存: docker build
--no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
部分不用缓存: 更改Dockerfile的部分代码即可

3.2、镜像的完整流程

3.2.1、流程图

3.2.2、简介

在工作中,我们经常会因为业务需求,而定制各种各样的Doker镜像,由于Dockerfile的便捷性,所以我们经常会基于Dockerfile来创建我们业务场景中所需要的各种镜像。
根据我自己的工作经验,我们在使用Dockerfile的过程中,一般只需要关注三个方面即可:
1、Dockerfile在使用的过程中,构建的指令越少越好,能合并的就合并。
2、基于Docker镜像的分层特性,我们最好按照项目的架构级别来定制不同层的镜像
3、Dockerfiel构建的过程中,功能越简单越好,最好只有一个

3.2.3、代码合并示例

# 原来效果
COPY ./setuptools_scm-3.3.3-py2.py3-none-any.whl /data/softs/
RUN apt-get update -y
RUN apt-get install nginx -y --allow-unauthenticated
RUN mkdir /data/meiduo -p && cd /data/meiduo
RUN apt-get install -y libjpeg-dev libfreetype6-dev libssl-dev --allowunauthenticated
RUN pip3 install /data/softs/setuptools_scm-3.3.3-py2.py3-none-any.whl
RUN pip install -r /data/softs/requirements.txt
RUN pip3 uninstall haystack -y
RUN rm -rf /usr/local/lib/python3.7/site-packages/haystack/
RUN pip3 uninstall django-haystack -y
RUN pip3 install django-haystack==2.8.1
RUN apt-get clean
RUN apt-get autoclean
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf ~/.cache/pip/
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf ~/.cache/pip/

# 改造效果
RUN apt-get update -y && apt-get install nginx libjpeg-dev libfreetype6-dev 
libssl-dev -y --allow-unauthenticated && pip3 install 
/data/softs/setuptools_scm-3.3.3-py2.py3-none-any.whl && pip3 install -r 
/data/softs/requirements.txt && pip3 uninstall haystack -y && rm -rf 
/usr/local/lib/python3.7/site-packages/haystack/ && pip3 uninstall djangohaystack -y && pip3 install django-haystack==2.8.1 && apt-get clean && apt-get 
autoclean && rm -rf /var/lib/apt/lists/* && rm -rf ~/.cache/pip/

3.2.4、分层效果图

3.2.5、功能效果图

 

posted @ 2023-05-18 18:22  小粉优化大师  阅读(38)  评论(0编辑  收藏  举报