DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Docker COPY 找不到同目录文件:build 的标准输入只有 Dockerfile

把 Dockerfile 文本重定向给 docker build - 时,没有文件系统上下文。区分上下文参数与 -f -,让 COPY 能读取项目目录。

Dockerfile 和 requirements.txt 明明在同一个目录,构建却报 COPY failed: file not found in build context or excluded by .dockerignore。如果启动命令是下面这种形式,应先检查传给构建器的输入:

docker build - < Dockerfile

这里的 - 是构建上下文参数。标准输入如果只有 Dockerfile 文本,Docker 会将它解释成 Dockerfile,构建没有文件系统上下文。当前目录中的其他文件并不会随这段文本一起送入构建。

让目录成为上下文

文件保存在项目目录时,直接把该目录作为上下文。以下命令需在项目目录执行,镜像名和文件名都是示例:

docker build -t web-service:diagnostic .

. 指定当前目录作为上下文,Docker 默认从其中读取名为 Dockerfile 的文件。如果 Dockerfile 使用其他名字,可以写:

docker build -t web-service:diagnostic -f Dockerfile.web .

-f 选择 Dockerfile,末尾的 . 选择可供 COPY 使用的目录。这两个参数各有用途。

必须从标准输入读 Dockerfile 时,使用 -f -

有些脚本会生成 Dockerfile 或通过重定向提供它,可以保留这种输入方式,同时明确提供目录上下文:

docker build -t web-service:diagnostic -f - . < Dockerfile

这条命令中的 - 是 -f 的值,表示从标准输入读取 Dockerfile;末尾的 . 仍表示真实目录上下文。不要把它与前面的 docker build - < Dockerfile 混为一谈。

通过标准输入传入 tar 包也能提供文件系统上下文,但那是另一种输入格式。不能仅因为两条命令都带 -,就认为文本重定向同样包含本地文件。

改完入口仍报错,再检查文件本身

查看实际命令中的上下文目录,确认 COPY requirements.txt ... 对应文件就在该目录内。COPY 的源路径相对上下文根目录解析,不会因为 Dockerfile 在子目录而自动切到那个子目录。

再核对文件名拼写、大小写和 .dockerignore。错误消息中出现 or excluded by .dockerignore 只是提示可能原因,并不能证明一定存在忽略规则。上下文为空时,删除忽略文件、改容器里的 WORKDIR 或关闭缓存,都不能补回根本没有提供的本地文件。

构建会执行 Dockerfile 中的指令并生成镜像;修正命令前保留原脚本,不要为了诊断顺便改为生产发布 tag。成功标准是目标 COPY 通过,预期文件出现在构建阶段的目标位置,后续依赖它的指令继续运行。若后续命令另报依赖或语法错误,应按新的错误处理。