现象
docker build 一开始就输出 Sending build context to Docker daemon 2.147GB;每次构建在第一条 Dockerfile 指令前要等数分钟;CI 磁盘与网络占用飙升;修改无关测试文件也会让缓存失效。
诊断
先看构建目录里到底是什么占空间:
du -sh . && du -sh -- * .[!.]* 2>/dev/null | sort -h | tail -15
docker build --progress=plain -t app . 2>&1 | head -20
tar -cf - --exclude-vcs . 2>/dev/null | wc -c
Node 项目通常是 node_modules 与 .git 最大,Python 项目是 .venv 与 __pycache__,数据项目则是数据集和中间产物。Sending build context 行显示的是实际传输量,即使几百 MB 也会拖慢每次构建;Dockerfile 中的忽略规则无法挽回,因为文件早已发送给构建器。
修复
补充 .dockerignore,并尽量从包含 Dockerfile 与源码的最小目录构建:
.git
node_modules
dist
coverage
playwright-report
test-results
*.log
.env*
data/
如果 Dockerfile 确实需要上层目录文件,使用 BuildKit 命名上下文而不是把整个 monorepo 发送过去:
docker buildx build --build-context shared=../shared -t app .
注意不要忽略构建真正需要的文件,否则会出现 COPY 失败或镜像缺文件。
验证
重新构建,确认 context 行降到数 MB、第一步立即开始,镜像仍能正常启动并响应冒烟测试。再改动一个已被忽略的测试文件重新构建,缓存不应失效;如果仍失效,检查 COPY . . 这类过宽指令,上下文小并不代表缓存一定命中。