压缩docker镜像的技巧

需求

团队构建的python应用镜像很大,比如centos7-python光基础镜像就有1.25G,python应用的镜像竟然4G多,异地进行部署安装或更新版本都非常的不方便,因此需要想办法对docker镜像进行压缩。

原理和工具

  • 两个思路(docker镜像是基于层的):

    • 思路1:减少镜像层数
    • 思路2:减少镜像每层的大小
  • 两个命令:

    • 查看镜像大小的命令:docker images |grep 镜像名称
    • 查看镜像每层信息的命令:docker history 镜像名称
      • 只查看大小和执行命令的缩减版 docker history --format "{{.Size}} : {{.CreatedBy}}" --no-trunc 镜像名称

方法总结

  • yum安装完成后执行 yum clean all,清除过程文件
  • 采用源代码编译安装方式的,安装完后要删除源代码和整个编译目录
  • python通过pip安装的,检查是否有缓存, ~/.cache/pip ,如果存在则删除
  • 尽量对执行语句进行合并,安装和清理务必要在一条docker语句中

错误的示例(下面语句合并为一个)

RUN wget http://www.02405.com/uploads/soft/201124/1-2011241A414.zip
RUN unzip 1-2011241A414.zip -d /usr/local/app/
RUN rm -rf /usr/lib64/libstdc++.so.6
RUN ln -s /usr/local/app/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
RUN wget https://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz
RUN tar -xzvf glibc-2.23.tar.gz
WORKDIR  glibc-2.23/
RUN pwd
RUN mkdir build
WORKDIR glibc-2.23/build
RUN /usr/local/app/glibc-2.23/configure --prefix=/usr/glibc-2.23
RUN make && make install
RUN cp /usr/glibc-2.23/lib/libm-2.23.so /usr/lib64/
RUN rm -rf /usr/lib64/libm.so.6
RUN ln -s /usr/lib64/libm-2.23.so /usr/lib64/libm.so.6

实践案例

通过优化,python基础镜像从1.25G降到594M

# docker history  --format "{{.Size}} : {{.CreatedBy}}" --no-trunc centos7-python:3.8.9
104B : /bin/sh -c #(nop) COPY file:db74ffd129bd8af31ba46b8cd5913d64736329af04d9efac30b2e8056cf98997 in /root/.pip/pip.conf
0B : /bin/sh -c #(nop)  ENV LC_ALL=zh_CN.UTF-8
3.33MB : /bin/sh -c localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
158MB : /bin/sh -c yum install kde-l10n-Chinese -y
214MB : /bin/sh -c set -ex     && rm -rf /etc/localtime     && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime     && yum install -y vim     && yum -y install cronie
158MB : /bin/sh -c set -ex     && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/bin/yum     && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/libexec/urlgrabber-ext-down     && yum install -y deltarpm
346B : /bin/sh -c set -ex     && mv /usr/bin/python /usr/bin/python27     && mv /usr/bin/pip /usr/bin/pip-python27     && ln -s /usr/local/python3/bin/python3 /usr/bin/python     && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
499MB : /bin/sh -c set -ex     && yum install -y wget tar libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make initscripts     && wget https://npm.taobao.org/mirrors/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz     && tar -zxvf Python-${PYTHON_VERSION}.tgz     && cd Python-${PYTHON_VERSION}     && ./configure prefix=/usr/local/python3     && make     && make install     && make clean     && rm -rf /Python-${PYTHON_VERSION}*     && yum install -y epel-release     && yum install -y python-pip
0B : /bin/sh -c #(nop)  ENV PYTHON_VERSION=3.8.9
0B : /bin/sh -c #(nop)  MAINTAINER developer ai@wanders.com
0B : /bin/sh -c #(nop)  CMD ["/bin/bash"]
0B : /bin/sh -c #(nop)  LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20191001
203MB : /bin/sh -c #(nop) ADD file:45a381049c52b5664e5e911dead277b25fadbae689c0bb35be3c42dff0f2dffe in /
  • 改进后构建方法:总镜像大小594M,对应3.8.10.Dockerfile,每层镜像信息如下:
#docker history  --format "{{.Size}} : {{.CreatedBy}}" --no-trunc centos7-python:3.8.10
104B : /bin/sh -c #(nop) COPY file:db74ffd129bd8af31ba46b8cd5913d64736329af04d9efac30b2e8056cf98997 in /root/.pip/pip.conf
0B : /bin/sh -c #(nop)  ENV LC_ALL=zh_CN.UTF-8
3.33MB : /bin/sh -c localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
27.7MB : /bin/sh -c yum install kde-l10n-Chinese -y && yum clean all
33B : /bin/sh -c set -ex     && rm -rf /etc/localtime     && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3.41kB : /bin/sh -c set -ex     && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/bin/yum     && sed -i "s#/usr/bin/python#/usr/bin/python27#" /usr/libexec/urlgrabber-ext-down
64B : /bin/sh -c set -ex     && mv /usr/bin/python /usr/bin/python27     && ln -s /usr/local/python3/bin/python3 /usr/bin/python     && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
360MB : /bin/sh -c set -ex     && yum install -y wget tar libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make initscripts     && wget https://npm.taobao.org/mirrors/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz     && tar -zxvf Python-${PYTHON_VERSION}.tgz     && cd Python-${PYTHON_VERSION}     && ./configure prefix=/usr/local/python3     && make     && make install     && make clean     && rm -rf /Python-${PYTHON_VERSION}*     && yum install -y epel-release     && yum clean all
0B : /bin/sh -c #(nop)  ENV PYTHON_VERSION=3.8.10
0B : /bin/sh -c #(nop)  MAINTAINER developer ai@wanders.com
0B : /bin/sh -c #(nop)  CMD ["/bin/bash"]
0B : /bin/sh -c #(nop)  LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20191001
203MB : /bin/sh -c #(nop) ADD file:45a381049c52b5664e5e911dead277b25fadbae689c0bb35be3c42dff0f2dffe in /

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Docker 是一个用于开发,交付和运行应用程序的开发平台。 它能够将应用程序和基础架构分开,保证开发,测试,部署...
    飘移1族阅读 591评论 0 0
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,795评论 1 21
  • 近几年 Docker 风靡技术圈,不少从业人员都或多或少使用过,也了解如何通过 Dockerfile 构建镜像,从...
    43ce3d72fadb阅读 1,817评论 0 2
  • docker官方文档:https://docs.docker.com 第一章 docker环境准备和安装 1.镜像...
    人生这点事儿阅读 461评论 0 0
  • 基本概念 镜像Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器 容器容器是从镜像创建的运...
    巨子联盟阅读 7,597评论 0 3