针对前两天构建的一个ubuntu + nginx + uwsgi + python 的代理IP服务 进行优化尝试
自行构建代理IP服务(docker一键式部署启动)
FROM ubuntuMAINTAINER tina_han<[email protected]># 更改apt源RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.listRUN apt-get cleanRUN apt-get updateRUN apt-get install -y vimRUN apt-get install -y python3RUN apt-get install -y python3-pip# 更改pip源RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simpleRUN pip3 config set install.trusted-host mirrors.aliyun.comRUN pip3 install pip -URUN pip3 install djangoRUN pip3 install requestsRUN pip3 install uwsgi# 设置时区,安装nignx前需要RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezoneRUN apt-get install -y nginx# 更换一个 nginx 的配置文件RUN rm /etc/nginx/sites-enabled/defaultCOPY default /etc/nginx/sites-enabled/# 导入项目ADD PMIP.tar.gz /home/# 启动容器CMD ["sh", "-c", "uwsgi -i /home/PMIP/PMIP/uwsgi.ini && nginx -g 'daemon off;'"]
可以看到,这里每一条语句都使用了一个独立的 run,这是非常不建议的写法,网上很多攻略都说,把多条RUN合成一条,可以减少镜像层数,并且减小镜像大小
当前镜像大小为522M
接下来我们把RUN合成一条
FROM ubuntuMAINTAINER tina_han<[email protected]>RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo 'Asia/Shanghai' >/etc/timezone && \ apt-get clean && \ apt-get update && \ apt-get install -y vim python3 python3-pip nginx && \ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple && \ pip3 config set install.trusted-host mirrors.aliyun.com && \ pip3 install pip -U && \ pip3 install django requests uwsgi && \ rm /etc/nginx/sites-enabled/defaultCOPY default /etc/nginx/sites-enabled/ADD PMIP.tar.gz /home/CMD ["sh", "-c", "uwsgi -i /home/PMIP/PMIP/uwsgi.ini && nginx -g 'daemon off;'"]
合并之后依然有518M,结果显示 RUN 合并后对镜像大小并没有什么影响
apt-get --no-install-recommends,可以不下载非必要依赖
FROM ubuntuMAINTAINER tina_han<[email protected]>RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo 'Asia/Shanghai' >/etc/timezone && \ apt-get clean && \ apt-get update && \ # 不下载非必要依赖 apt-get install -y --no-install-recommends vim python3 python3-pip nginx && \ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple && \ pip3 config set install.trusted-host mirrors.aliyun.com && \ pip3 install pip -U && \ pip3 install django requests uwsgi && \ rm /etc/nginx/sites-enabled/defaultCOPY default /etc/nginx/sites-enabled/ADD PMIP.tar.gz /home/CMD ["sh", "-c", "uwsgi -i /home/PMIP/PMIP/uwsgi.ini && nginx -g 'daemon off;'"]
ERROR: Command errored out with exit status 1: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-tim3jkzo/uwsgi/setup.py'"'"'; __file__='"'"'/tmp/pip-install-tim3jkzo/uwsgi/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-uqbm4rmh/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.8/uwsgi Check the logs for full command output.
删除非运行环境时,需要与构建该环境在同一个RUN中,否则非运行环境仍然会被带入镜像中(以其中某一层的方式存在)
rm -rf /var/cache/apk/*
rm -rf /var/lib/apt/lists/*
apt-get autoremove -y
apt-get remove -y python3-pip
FROM ubuntuMAINTAINER tina_han<[email protected]>RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo 'Asia/Shanghai' >/etc/timezone && \ apt-get clean && \ apt-get update && \ apt-get install -y python3 python3-pip nginx && \ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple && \ pip3 config set install.trusted-host mirrors.aliyun.com && \ pip3 install pip -U && \ pip3 install django requests uwsgi && \ # 删除不必要的环境 rm -rf /var/cache/apk/* && \ rm -rf /var/lib/apt/lists/* && \ apt-get remove -y python3-pip && \ # autoremove 慎用,删除自动安装的依赖包,千万不要在主机上尝试 apt-get autoremove -y && \ rm /etc/nginx/sites-enabled/defaultCOPY default /etc/nginx/sites-enabled/ADD PMIP.tar.gz /home/CMD ["sh", "-c", "uwsgi -i /home/PMIP/PMIP/uwsgi.ini && nginx -g 'daemon off;'"]
经本地测试镜像可用,大小为249M,缩减一半以上
猜测:docker 每一层都会包含上一层的所有数据,那么试试看,我们让环境安装之后的层数变少的话,是不是镜像大小也会变少
结论:docker每一层是记录的针对上一层的变化,并不会复制上一层的数据,就像是 git
我们将之前的最后两行提到RAN的上面去
FROM ubuntuMAINTAINER tina_han<[email protected]>ADD PMIP.tar.gz /home/CMD ["sh", "-c", "uwsgi -i /home/PMIP/PMIP/uwsgi.ini && nginx -g 'daemon off;'"]RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo 'Asia/Shanghai' >/etc/timezone && \ apt-get clean && \ apt-get update && \ apt-get install -y vim python3 python3-pip nginx && \ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple && \ pip3 config set install.trusted-host mirrors.aliyun.com && \ pip3 install pip -U && \ pip3 install django requests uwsgi && \ # 删除非必要环境和文件 rm -rf /var/cache/apk/* && \ rm -rf /var/lib/apt/lists/* && \ apt-get remove -y python3-pip && \ apt-get autoremove -y && \ rm /etc/nginx/sites-enabled/defaultCOPY default /etc/nginx/sites-enabled/
结果显示没有任何鸟用,说明猜测错误
可以省一个vim
FROM ubuntuMAINTAINER tina_han<[email protected]>RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo 'Asia/Shanghai' >/etc/timezone && \ apt-get clean && \ apt-get update && \ # 这里多出来一个安装 libpython3.8 因为在取消VIM的安装后,因为 apt-get autoremove 会删除掉 libpython3.8.so.1.0这个文件,导致uwsgi无法启动成功,所以我们手动安装一下。 apt-get install -y libpython3.8 python3 python3-pip nginx && \ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple && \ pip3 config set install.trusted-host mirrors.aliyun.com && \ pip3 install pip -U && \ pip3 install django requests uwsgi && \ rm -rf /var/cache/apk/* && \ rm -rf /var/lib/apt/lists/* && \ apt-get autoremove -y python3-pip && \ rm /etc/nginx/sites-enabled/default# 将之前的ADD命令换成了COPY,这样可以在启动容器之前先对里面的settings.py进行修改COPY project /home/COPY default /etc/nginx/sites-enabled/CMD ["sh", "-c", "uwsgi -i /home/PMIP/PMIP/uwsgi.ini && nginx -g 'daemon off;'"]
可以看出镜像又缩小了几十兆