• 【docker】dockerfile优化镜像大小


    一、正常构建镜像

    以构建nginx为例子。实现dockerfile的优化。

    1、dockerfile文件内容

    FROM centos:7
    RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel make
    ADD nginx-1.12.2.tar.gz /opt
    RUN useradd -M -s /sbin/nologin nginx
    WORKDIR /opt/nginx-1.12.2
    RUN ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module
    RUN make && make install
    RUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
    EXPOSE 80
    EXPOSE 443
    VOLUME ["/usr/local/nginx/html"]
    CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    2、查看构建好的镜像大小

    docker build -t nginx:v1 .
    #构建镜像
    
    docker images
    #查看镜像大小
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    二、优化dockerfile文件

    1、将标准输出到黑洞,删除缓存和压缩文件

    注意!!如果输入&>/dev/null,需要确保执行的命令时没有问题的,不然可以选择 1>/dev/null,错误的输出还是会打印到页面,方便查看。

    重新修改dockerfile文件

    FROM centos:7
    RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel make &>/dev/null && yum clean all
    ADD nginx-1.12.2.tar.gz /opt
    RUN useradd -M -s /sbin/nologin nginx
    WORKDIR /opt/nginx-1.12.2
    RUN ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module &>/dev/null
    RUN make && make install &>/dev/null
    RUN rm -rf /opt/nginx-1.12.2
    RUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
    EXPOSE 80
    EXPOSE 443
    VOLUME ["/usr/local/nginx/html"]
    CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    重新构建查看大小

    docker build -t nginx:v2 .
    
    docker images
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2、减少使用RUN命令

    因为每一条命令都会构建一层镜像,较少命令的使用,相当于减少构建的层数。

    修改Dockerfile文件

    FROM centos:7
    ADD nginx-1.12.2.tar.gz /opt
    WORKDIR /opt/nginx-1.12.2
    RUN useradd -M -s /sbin/nologin nginx && yum -y install gcc gcc-c++ pcre-devel zlib-devel make  && ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module && make && make install &>/dev/null && yum clean all && rm -rf /opt/nginx-1.12.2 &&ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
    EXPOSE 80
    EXPOSE 443
    VOLUME ["/usr/local/nginx/html"]
    CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    重新构建查看大小

    docker build -t nginx:v3 .
    
    docker images 
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    3、多阶段构建

    重新编写Dockerfile文件

    FROM centos:7 as ydq
    ADD nginx-1.12.2.tar.gz /opt
    WORKDIR /opt/nginx-1.12.2
    RUN useradd -M -s /sbin/nologin nginx && yum -y install gcc gcc-c++ pcre-devel zlib-devel make  && ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module && make && make install &>/dev/null && yum clean all && rm -rf /opt/nginx-1.12.2 &&ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
    
    
    FROM centos:7
    EXPOSE 80
    EXPOSE 443
    VOLUME ["/usr/local/nginx/html"]
    COPY --from=ydq /usr/local/nginx /usr/local/nginx
    CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    查看重新构建的大小

    docker build -t nginx:v4 .
    
    docker images
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4、选择更轻量级的模板

    以下不是dockerfile优化,不过多解释,可理解为基于模板创建镜像,

    wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
    #下载debian压缩包
    
    docker import debian-7.0-x86-minimal.tar.gz -- debian:v1
    
    • 1
    • 2
    • 3
    • 4

    三、总结

    dockerfile优化主要可以从几点切入

    1、减少标准输出的内容,使用 yum clean all 清除缓存,删除上传的压缩包

    2、减少使用RUN命令,能合并尽量合并

    3、可以使用多阶段构建镜像(不过需要17版本之后才支持)

  • 相关阅读:
    AP9196 DC-DC升降 升降压 6A 恒流DEMO原理图
    基于FPGA的任意字节数的串口接收(含源码工程)
    更改idea的JDK版本
    RT-Thread 内存管理(学习一)
    10 大数据科学Python库,你用过几个?
    【图解RabbitMQ-2】图解JMS规范与AMQP协议是什么
    一个例子形象的理解协程和线程的区别
    vscode平台上通过Embedded IDE搭建单片机开发环境
    OPENGL 不同绘制图元的类型,顶点索引的解释方式不同
    [JDK8下的HashMap类应用及源码分析] 数据结构、哈希碰撞、链表变红黑树
  • 原文地址:https://blog.csdn.net/m0_57515995/article/details/126894947