Watch at Ease看见世界,读懂生活。

技术 · 实用指南

Docker build 提示 COPY 找不到源文件?改 Dockerfile 前先审计真实 context

COPY 只能读取 checkout、生成步骤和 ignore 过滤后的 build context。先保存命令并证明实际快照,再修一个明确边界,避免扩大 context 或打包 Secret。

Original zh-CN diagram of Docker context selection and COPY visibility.
原创插画:COPY 只能读取过滤后的已选 context。 Watch at Ease

Docker COPY 失败不等于文件不在电脑上,而是该源文件不在 BuildKit 实际收到并过滤后的 context 中,或 COPY 正从另一个 stage、image、named context 读取。

先保存命令和错误,再证明 context 类型、checkout 内容、有效 ignore 规则与 source kind;只修一个边界,并避免把 Secret 或整个父目录发送给 builder。

保存命令并确认真实 context

记录完整错误、cwd、版本、builder、Dockerfile 路径和最后的 context 参数;`-f` 不会改变 context root。

区分本地目录、Git、tar、named 或 empty context;主机上看得到不等于 builder 收得到。

证明 checkout 与生成后的源文件

在实际 workspace 或 Git snapshot 中按精确大小写检查路径,并核 sparse checkout、submodule、LFS 与 checkout path。

若文件由前序步骤生成,记录生成位置;默认 Git context 不会读取 runner 上刚生成的文件。

计算有效 ignore 规则

检查 context 根的 `.dockerignore` 及 Dockerfile 专用 ignore;后者优先,最后一条匹配决定结果。

不要为了通过而取消大范围规则或复制 Secret,只加最窄安全例外。

分开默认与 --from 来源

普通 COPY 读默认 context;COPY --from 读 stage、image 或 named context 的根。

不要用 `../` 逃出 context;需要另一棵目录时显式声明窄 named context。

一次修正并验证产物

只改 context、checkout、生成顺序、大小写、单条 ignore、Git/path context 或 --from 映射中的一个事实。

做一次 fresh build,核 source 已传输并检查最终 image;CI 必须复现同一 context contract。

Original zh-CN diagram of absent, ignored and --from source branches.
原创插画:先分类缺失源,再扩大规则或修改 COPY。 Watch at Ease