Docker 构建总是很慢?镜像分层缓存的 5 个实用习惯
刚学 Docker 的时候,我最大的困惑不是写 Dockerfile,而是每次改一行代码,docker build 就要重新跑好几分钟。后来才明白:Docker 的镜像分层缓存是个"按顺序失效"的机制,掌握几条习惯就能让构建快一个数量级。
习惯一:把变化最少的部分放最前面
每一层都依赖它之前的所有层。基础镜像、系统依赖这些几乎不变的内容,一定要写在 Dockerfile 的最前面;业务代码放最后。这样改代码时只会重建最后一两层。
习惯二:先复制依赖描述文件,再安装
以 Python 为例,不要上来就 COPY . .。先 COPY requirements.txt . 然后 RUN pip install -r requirements.txt,最后再复制源码。依赖没变时,pip install 这一层直接命中缓存,秒过。
习惯三:RUN 指令合并,但别贪多
多个 apt-get 或 pip install 合并成一条 RUN 能减少层数,但一个巨型 RUN 会让缓存粒度变粗。折中做法:按"变化频率"分组,系统依赖一组、语言依赖一组、构建工具一组。
习惯四:用好 .dockerignore
node_modules、__pycache__、.git 这些目录如果不小心被 COPY 进去,不仅镜像变大,还会导致缓存频繁失效。一个 10 行的 .dockerignore 文件,效果立竿见影。
习惯五:多阶段构建收尾
用 builder 阶段装编译依赖、跑构建,最终镜像只 COPY 产物。镜像从 1GB 瘦到 100MB,推送拉取都快,缓存命中率也更高。
最后分享一个验证方法:docker build --progress=plain 可以看到每一层是 CACHED 还是重新构建。改完 Dockerfile 跑一次,看看缓存命中情况,调优就有依据了。
记住一句话:Dockerfile 不是按"逻辑顺序"写,而是按"变化频率从低到高"写。 养成这个思维,构建速度自然就上去了。
- 点赞
- 收藏
- 关注作者
评论(0)