Docker构建触发ADD failed报错求助:文件存在却无法识别
从你给出的错误信息、目录结构和Dockerfile内容来看,出现这个问题主要有几个可能的原因,我来逐一拆解:
1. 文件名不匹配
错误提示里Docker在找tmp/app-jar-with-dependencies.jar,但你的Dockerfile里写的是ADD tmp/app.jar app.jar——这明显是文件名对不上。要么是你Dockerfile里的文件名写错了,要么是你tmp目录里的jar实际叫app-jar-with-dependencies.jar,而不是app.jar,导致Docker找不到你指定的文件。
2. .dockerignore排除了tmp目录
你有一个.dockerignore文件,里面很可能包含了tmp/这条规则。Docker构建时会忽略.dockerignore里指定的目录/文件,要是tmp被排除了,构建上下文里就没有这个目录,自然找不到里面的jar包。你可以打开.dockerignore看看是不是有这条规则。
3. 构建命令的上下文路径不对
如果你执行docker build的时候,不是在包含Dockerfile、tmp、target的当前目录下运行,而是跑到了父目录或者其他地方,那Docker的构建上下文就不包含tmp目录,也会触发找不到文件的错误。比如你应该在当前目录执行:
docker build -t your-image-name .
这里的.代表把当前目录作为构建上下文,确保所有需要的文件都能被Docker访问到。
对应的解决步骤:
- 核对文件名:先去tmp目录里看一下jar的实际名称,如果是
app-jar-with-dependencies.jar,要么把Dockerfile里的tmp/app.jar改成tmp/app-jar-with-dependencies.jar,要么把jar重命名为app.jar。 - 检查.dockerignore:如果里面有
tmp/,直接删掉这一行,让Docker能识别tmp目录。 - 确认构建上下文:确保执行
docker build时在正确的目录下,用.指定当前目录作为上下文。
另外,既然你的target目录里也有这个jar包,其实更建议用target里的文件(Java项目打包后jar一般都在target目录),比如把Dockerfile里的ADD命令改成:
ADD target/app-jar-with-dependencies.jar app.jar
这样更符合常规项目结构,也能避免tmp目录可能带来的问题。
内容的提问来源于stack exchange,提问作者Nilotpal

