需求
团队构建的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
- 原构建方法:总镜像大小1.25G,对应3.8.9.Dockerfile.huge,每层镜像信息如下:
# 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 /