你的 Python 镜像还好吗?

随着 k8s 集群规模变大,以及弹性扩容的触发,导致 harbor 仓库的瓶颈问题逐渐暴露出来,目前也做了一些优化措施:

  1. 增大 harbor ECS 规格,网络带宽会增加
  2. 使用阿里 dragonfly p2p 镜像分发技术,多次测试下来难以应对大数据量分发场景,暂时放弃了
  3. 增加 Harbor Proxy Cache 提高网络并发
  4. 镜像优化,减少体积
  5. 镜像提前预热分发,目前正在考虑方案

在做镜像优化的时候,发现之前我们的 python 提速方案还有一些瑕疵,所以有了这里的分析。
在 Python 项目构建 Docker 镜像时,经常遇到项目源码才几百 KB,但是安装的依赖能高达数百 MB,甚至 GB,这不仅使镜像体积变的很大,而且因为网络安装依赖包导致严重拖慢构建速度。

项目环境:

注意:这里仅关系依赖问题,所以忽略源码部分

# tree
.
├── code
│   └── requirements.txt
└── Dockerfile
# cat code/requirements.txt 
oss2==2.9.0
keras==2.3.1
numpy==1.18.1
Pillow==5.2.0
Flask==1.1.1
requests==2.22.0
gevent==1.4.0
gunicorn==19.9.0
tensorflow==2.0.0b1

常规构建:

示例 1:

# cat Dockerfile 
FROM python:3.6.8

COPY code/requirements.txt /code/requirements.txt

RUN set -eux \
    && pip3 install --no-cache-dir -r /code/requirements.txt \
    && rm -rf /tmp/* 

相当糟糕,依赖安装了 713MB,花了 5 分钟,太慢了。

# time docker build -t test:v1.0 .
real    5m6.002s
user    0m0.089s
sys     0m0.073s
# docker history test:v1.0              
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
fbdec4c33473        About a minute ago   /bin/sh -c set -eux     && pip3 install --no…   713MB               
...

如何提速:

  1. 使用内网 pip 源代替公网源
  2. 提前安装 pip 依赖,我们这里选择该方案

基于刚才已经构建过的依赖镜像,再次去构建时间工作的镜像
示例 2:

# cat Dockerfile 
FROM test:v1.0

COPY code /code

RUN set -eux \
    && pip3 install --no-cache-dir -r /code/requirements.txt \
    && rm -rf /tmp/* 

EXPOSE 8080

CMD ["xxx"]

为什么这里再次安装 requirements.txt,直接删掉该步骤不就好了吗?
实际情况下,研发人员可能会在仓库中修改 requirements.txt,如果这里不再次安装下,最终发版可能就要提示缺少包而报错了。这里再次安装下依赖,就是防止该问题。

再次构建,相当好,8 秒,再次安装的依赖层 0B(我们这里没有模拟研发人员修改 requirements.txt 的情况),我们取得了巨大的进步。

# time docker build -t test:v2.0 .
real    0m8.205s
user    0m0.063s
sys     0m0.056s
# docker history test:v2.0
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
c2375fd5cd9e        44 seconds ago      /bin/sh -c set -eux     && pip3 install --no…   0B                  
...
fbdec4c33473        9 minutes ago       /bin/sh -c set -eux     && pip3 install --no…   713MB               
...

3 个月以后

这个词有点像电影里的镜头,以示例 2 中的 Dockerfile 再次构建:
示例 3:

# time docker build -t test:v3.0 .
real    2m3.205s
user    0m0.063s
sys     0m0.056s
# docker history test:v3.0
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
c2375fd5cd9e        44 seconds ago      /bin/sh -c set -eux     && pip3 install --no…   173MB                  
...
fbdec4c33473        3 months ago        /bin/sh -c set -eux     && pip3 install --no…   713MB               
...

问题来了,随着岁月的流逝,构建时间怎么变成了 2 分钟,再次安装的依赖层 173MB(我们这里没有模拟研发人员修改 requirements.txt 的情况)

为什么呢?

原来安装依赖的时候除了上面 requirements.txt 中写好的依赖,还有一些没有出现在 requirements.txt 中的依赖,而这些依赖的版本如 grpcio>=1.8.6 会随着时间的推移,而产生不同的版本
...
Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/site-packages (from tensorflow==2.0.0b1->-r /code/requirements.txt (line 9)) (1.34.1)
Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/site-packages (from tensorflow==2.0.0b1->-r /code/requirements.txt (line 9)) (0.33.4)
...

如何解决:

  1. 将所有依赖一个不少的写入 requirements.txt 中,应该比较麻烦
  2. 做一个定时任务,每周重新构建一次依赖层镜像
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容