构建上下文是什么
docker build 最后那个路径就是构建上下文:目录内容(除去 .dockerignore 排除的)会打包发送给构建器,COPY 与 ADD 只能引用其中的文件。上下文过大是构建变慢与敏感文件进镜像最常见的根源。
基本信息
| 用途 | 提供构建时需要的文件来源 |
|---|---|
| 语法 | docker build [选项] 上下文路径,可以是目录、URL 或标准输入 |
| 体积控制 | 用 .dockerignore 排除数据、日志、依赖与产物目录 |
| 硬限制 | 上下文之外的文件无法被 COPY |
| 缓存影响 | 上下文内容参与层缓存计算 |
典型使用场景
- 新项目先配好忽略规则,避免把依赖目录与构建产物打进上下文
- 排查构建启动很慢:先看上下文体积,再看依赖安装耗时
- 排查镜像里有不该出现的文件:确认是不是上下文一起带进去了
- 用标准输入或归档流做临时构建,避免生成中间目录
- CI 里把上下文限定为仓库中明确的子目录,构建更快更可预测
- 排查文件明明存在却报找不到:确认它在不在上下文内或被忽略规则排除
示例
示例
du -sh . # 先看上下文有多大
docker build -t app/web:1.0 . # 以当前目录作为上下文
docker build -t app/web:1.0 ./api # 以子目录作为上下文
tar czf - app | docker build -t app/web:1.0 - # 用归档流作为上下文与上下文相关的常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 构建刚开始就很慢 | 上下文体积大,传输耗时 | 先加 .dockerignore 排除无关目录 |
| 镜像里出现敏感文件 | 上下文包含 .env 或密钥文件 | 写进忽略规则并从上下文移出 |
| COPY 报找不到文件 | 文件在上下文之外或被忽略 | 调整上下文位置或忽略规则 |
| 构建结果不可复现 | 上下文里含本地生成物 | 忽略产物目录,只保留源码 |
上下文按目录树打包,指向外部的软链接不会被跟随复制;需要外部文件时应当把它放进上下文,或用其他方式提供。
忽略规则只影响打包上传的内容,不修改宿主机上的文件;改动之后要重新构建才会生效。
上下文内容参与层缓存计算:把日志、数据集这类频繁变化的目录排除掉,能减少大量无意义的缓存失效。