为什么docker build发送构建上下文到Docker daemon速度极慢?
问题根因说明
你之前调整基础镜像到阿里云没有生效,是因为发送构建上下文到Docker daemon的步骤发生在拉取基础镜像之前,优化基础镜像源对这一步的耗时没有任何影响。当前耗时过高的核心原因有以下几点:
- 本地和服务端Docker运行环境差异:你本地iMac上的Docker daemon是本机运行,构建上下文直接本地读写无需跨网络/跨进程传输;如果服务端使用的是远程Docker daemon、Docker-in-Docker或虚拟机内运行的Docker,上下文需要跨节点/跨进程传输,网络或IO瓶颈会直接拉长该步骤耗时。
- 构建上下文存在冗余:当前构建目录下有大量不需要参与镜像构建的文件(比如node_modules、git历史、日志文件、临时缓存等)被打包进了上下文,虽然总大小只有357MB,但如果包含大量小文件,低性能设备的遍历、打包、传输耗时会被大幅放大。
- 服务端硬件性能不足:如果服务端是低配置共享型云服务器,或者使用机械盘/低性能云盘,磁盘IO性能远低于你本地iMac的SSD,处理大量小文件的效率会明显下降。
修复方案
- 配置
.dockerignore过滤冗余文件:在Dockerfile同级目录创建.dockerignore文件,优先推荐全局排除后仅放行需要的文件,最大化降低上下文体积:
# 先排除所有文件 * # 仅放行构建需要用到的内容 !build/ !default.conf
配置后构建上下文只会包含你实际用到的build目录和nginx配置文件,体积会降到仅和你的前端构建产物大小一致,传输耗时会大幅下降。
- 调整Dockerfile指令顺序优化缓存复用:将变更频率更低的指令前置,更好的利用镜像层缓存,避免重复操作:
FROM registry.cn-hangzhou.aliyuncs.com/dabai_app_k8s/nginx:1.21.1 ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ TZ=Asia/Shanghai MAINTAINER huanghaihua # 先复制变更频率低的配置文件,镜像层可复用 COPY default.conf /etc/nginx/conf.d/default.conf # 最后复制变更频率高的前端产物 ADD build/ /usr/share/nginx/html/ EXPOSE 80
- 优化服务端Docker运行环境:确认服务端Docker daemon为本地运行,没有配置远程daemon代理;如果是低配置云服务器,可以升级到SSD云盘,或者临时将构建目录挂载到tmpfs内存文件系统提升打包速度。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

