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、功能效果图