背景
服务上线通过jenkins进行docker build操作,研发反馈每次构建时间很长,大约15分钟。
排查过程
起初通过jenkins日志发现在docker build后,push的过程很久(harbor私有仓库,故排除网络问题),于是怀疑docker镜像体积太大导致的,通过查看最后传到镜像仓库中的镜像大小发现确实很大,4个多G。
在这之后开始查看Dockerfile,构建过程并不多,只是安装了一部分python的包(300M左右)并且基础镜像也只有2个G左右,理论上远远达不到4个多G。基础镜像由于业务需求已经无法再变小,所以又回头去看nginx日志,又有了新的发现,每次docker build时候都会打印一条日志:
这么大的东西不知道是什么,于是到网上查到发现是docker build去获取的上下文内容,默认是dockerfile所在目录的所有东西,docker客户端会将这些文件发送到docker服务端。之前并没有关注过上下文这个概念,以为docker build后加的 . 代表的是构建目录。到此问题就清晰了,Dockerfile目录就是git拉下来的代码目录,那么看看到底哪个文件占用空间大就可以解决问题了。
经过排查后发现.git文件有3个G,于是确认是因为这个文件过大导致的镜像体积过大。
解决方法
在Dockerfile同级目录下添加一个 .dockerignore 文件,在文件中写上获取上下文时忽略的文件或者目录即可,如下:
.git
_mockData
deleted
email-templates
script
static
docker再次build时镜像,镜像大小明显缩小,至此问题解决。
注意,千万不要直接删除代码仓库的.git,尽量通过.dockerignore 文件来解决问题,因为可能会因为jenkins构建目录缓存问题导致无法生效。